日常生活中听音乐时大多数为MP3音乐,使用FFMpeg可以解码MP3,同样FFMpeg也支持MP3编码,FFMpeg使用第三方libmp3lame即可编码MP3格式。不但如此,MP3编码还是低延迟的编码,可以支持的采样率比较多,包含44100,48000.32000,22050,24000,16000,11025,12000,8000多种采样率,采样格式也比较多,包s32p(signed32bits,planar),fltp(float,planar),s16p(signed16bits,planar)多种格式,声道布局方式支持包含mono(单声道模式),stereo(环绕立体声模式),下面就来详细介绍MP3编码参数。
MP3编码参数介绍
查看FFmpeg对于MP3的参数支持,可以通过以下命令得到MP3的参数:
ffmpeg -h encoder=libmp3lame
MP3编码参数
从图中可以看到,FFMpeg对mp3编码操作相关的参数主要包含了主要的控制参数,更高级的参数来控制,尚未全部从lame中移植到FFMpeg中,还有待开发完善。下面就来介绍FFMpeg中重点支持的这些参数的使用即基本原理。
MP3的编码质量设置
在FFMPEG中进行MP3编码采用的是第三方库libmp3lame,所以进行MP3编码时,需要设置参数acodec为libmp3lame,命令行如下:
ffmpeg -i input -acodec libmp3lame output.com
根据上面的命令行可以得到音频编码为MP3封装文件。
MP3编码的码率得到控制之后,控制质量时需要通过-qscale:a进行控制,也可以使用表中的q参数进行控制,质量不同码率也不同,详细可以参考下面表:
MP3基本信息与q参数的对应参数
表中可以作为参考,如果遇到将低码率转换为高码率的情况,则并不一定会很符合上述参数,但在大多数情况下是符合的,下面举例说明:
ffmpeg -i input.mp3 -acodec libmp3lame -q:a 8 output.mp3
执行完上面这条命令之后,将生成的output.mp3的码率区间设置在70kbit/s至105kbit/s之间,下面将转码前的input.mp3与转码后的output.mp3做一个比价:
从以上代码可以看到,转码前的input.mp3的码率为128kbit/s,转码后的output.mp3的码率为91kbit/s。在转码过程中,从FFmpeg的输出过程信息中可以看到编码时的码率在不断地发生变动:
size= 3194kB time=00:04:45.98 bitrate= 91.5kbits/s speed=56.x
以上码率设置方式为VBR码率,常见的MP3编码设置为CBR,通过FFmpeg参数-b即可设置,在FFMpeg编码过程中,码率几乎不会波动:
ffmpeg -i input.mp3 -acodec libmp3lame -b:a 64k output.mp3
执行完上述命令之后,结果将会生成编码为MP3的音频。
对比转码前与转码后的两个MP3文件;
两个文件均为CBR编码方式编码的MP3,并且可以看到编码过程中码率几乎没有波动:
size= 2235kB time=00:04:45.98 bitrate= 64.0kbits/s speed=43.5x
平均码率参数ABR
ABR是VBR与CBR的混合产物,表示平均码率编码,使用ABR参数之后,编码速度将会比VBR高,但是质量会比VBR的编码稍逊一些,比CBR编码好一些,在FFmpeg中,可以使用参数-abr来控制MP3编码方式:
ffmpeg -i input.mp3 -acodec libmp3lame -b:a 64k -abr 1 oupiput.mp3
执行上面这条命令之后,编码之后的输出信息如下:
原本为64kbit/s码率的CBR编码方式的mp3音频,因为设置abr参数之后,成为ABR编码方式的MP3音频,可以观察编码过程中的输出内容:
size= 2270kb time=00:04:45.98 bitrate= 65.0kbit/s spedd= 42.8x
看似VBR,其实ABR。