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) |