Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1292553
  • 博文数量: 79
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 2719
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 12:07
个人简介

樽中酒不空

文章分类

全部博文(79)

文章存档

2024年(3)

2020年(4)

2019年(1)

2017年(2)

2016年(2)

2015年(7)

2014年(11)

2013年(13)

2012年(18)

2011年(2)

2010年(16)

分类: C/C++

2013-07-07 22:01:58

lame是mp3的一个实现库,不过一般都是在学习ffmpeg过程中顺便学它的。
很多年以前直接在嵌入式上开发,最近发现版本稍有些变化,再整理一下。
最新的版本lame-3.99不支持vc6了,带的是vc2008工程。3.97是vc6。(3.98没有看)。
如果lame直接解码成wav,参数是--decode, 在代码中会走到这个分支:
if (lame_get_decode_only(gf)) {
        /* decode an mp3 file to a .wav */
        if (mp3_delay_set)
            lame_decoder(gf, outf, mp3_delay, inPath, outPath);
        else
            lame_decoder(gf, outf, 0, inPath, outPath);
    }
这样解出来是各种属性和原来的mp3一致的,比如抽样,声道数等。

如果对各属性进行转换,比如由立体声的mp3转成单声道,lame的实现是带参数 -mm。在代码中:
 else {
            /*
             * encode a single input file
             */
            brhist_init_package(gf);
            ret = lame_encoder(gf, outf, 0, inPath, outPath);
            
            if (silent<=0) print_lame_tag_leading_info(gf);
            lame_mp3_tags_fid(gf, outf); /* add VBR tags to mp3 file */
   
            if (silent<=0) print_trailing_info(gf);
            
            fclose(outf); /* close the output file */
            close_infile(); /* close the input file */
            lame_close(gf);
        }

lame_encoder里面再调用get_audio从文件里读出数据,然后直接lame_encode_buffer_int转成相应的属性。

运行结果之后, 文件的codec没变,mp3输出还是mp3。如果想要wav,再来一次--decode。不过,一般使用的时候,不会直接调用lame.exe的,只是参考它的流程,自己来实现。
所以,一般流程:
lame_encoder重采样或转声道,然后再decoder。或直接在lame_encoder过程中,每encode一帧,就decode一下。不过,从速度上来看, 先整个文件重编码,再decode,要更快一些。具体用法根据实现需求再决定吧。


阅读(11607) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~