在音频中,无论直播与点播,AAC都是目前最常用的一种音频编码格式,例如RTMP直播,HLS直播,RTSP直播,FLV直播,FLV点播,MP4点播等文件中都是常见的AAC音频。
与MP3相比,AAC是一种编码效果更高,编码音质更好的音频编码格式,常见的使用AAC编码后的文件存储格式为m4a,如果在iphone或者m4a。FFMpeg可以组成AAC的三种编码器具体如下。
aac: FFmpeg本身的AAC编码实现
libaac: 第三方的AAC编码器
libfdk_aac: 第三方的AAC编码器
后面两种编码器为非GPL协议,所以所有起来需要注意,在预编译时需要注意采用nonfree的支持,下面就来详细介绍三种编码器的使用方法。
FFMpeg中的AAC编码器使用
FFmpeg中的AAC编码器在早期为实验版本,而从2015年12月5日起,FFMPEG中的AAC编码器已经可以正式开始使用,所以在使用AAC编码器之前,首先要确定自己的FFMpeg是什么时候发布的版本,如果是2015年12月5日前发布的版本,那么在编码时需要使用-strict experimental 或-strict-2参数来声明AAC为实验版本,下面列举几个使用FFmpeg中的AAC编码器的例子:
ffmpeg -i input.mp4 -c:a aac -b:a 160k output.aac
根据这条命令可以看到,编码为AAC音频,码率为160kbit/s,编码生成的输出文件为output.aac文件:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isomavc1
creation_time : 2013-05-03T22:51:07.000000Z
Duration: 00:00:46.61, start: 0.000000, bitrate: 3949 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 960x400 [SAR 1:1 DAR 12:5], 3859 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
Metadata:
creation_time : 2013-05-03T22:50:47.000000Z
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 92 kb/s (default)
Metadata:
creation_time : 2013-05-03T22:51:07.000000Z
handler_name : GPAC ISO Audio Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:1 -> #0:0 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
Output #0, adts, to 'output.aac':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isomavc1
encoder : Lavf58.76.100
Stream #0:0(und): Audio: aac (LC), 48000 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
creation_time : 2013-05-03T22:51:07.000000Z
handler_name : GPAC ISO Audio Handler
vendor_id : [0][0][0][0]
encoder : Lavc58.134.100 aac
size= 891kB time=00:00:46.59 bitrate= 156.7kbits/s speed= 74x
接下来在列举一个例子:
ffmpeg -i input.wav -c:a aac -q:a 2 output.m4a
从这条命令可以看出,在编码AAC时,同样也用到qscale参数,这个q在这里设置的有效范围为0.1~2之间,其用于设置AAC音频的VBR质量,效果并不可控,可以设置几个参数来看一下效果:
Input #0, wav, from 'input.wav':
Duration: 00:04:13.10, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16 1411kb/s
Input #1, mov,mp3,m4a,4gp,3g2,mj2,from 'output_0.1.m4a':
Metadata:
encoded_by : Lavf57.66.102
Duration: 00:04.13.12, start: 0.000000, bitrate: 23 kb/s
Stream #1:0(und): Audio: aac(LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp , 24kb/s (default)
Input #2, mov,mp3,m4a,4gp,3g2,mj2,from 'output_0.1.m4a':
Metadata:
encoded_by : Lavf57.66.102
Duration: 00:04.13.12, start: 0.000000, bitrate: 23 kb/s
Stream #2:0(und): Audio: aac(LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp , 186kb/s (default)
从以上代码可以看到一共有input文件,具体如下。
input#0为原始文件,码率为1411kbit/s
input#1为设置q:a为0.1的文件,码率为24kbit/s
input#2为设置q:a为2.0的文件,码率为186kbit/s
可以使用-q:a设置AAC的输出质量,关于AAC的输出控制很简单,这里将介绍这么多。
FDK AAC第三方的AAC编解码Codec库
FDK-AAC库是FFMpeg支持的第三方编码库中质量最高的AAC编码库,关于编码音质的好坏与使用方式同样有着一定的关系,下面就来介绍一下libfdk_aac的几种编码模式。
1.恒定码率(CBR)模式
如果使用libfdk_aac设定一个恒定的码率,改变编码后的大小,并且可以兼容HE-AAC Profile,则可以根据音频设置的经验设置码率,例如如果一个声道使用64kbit/s,那么双声道为128kbit/s,环绕立体声为384kbit/s,这种通常为5.1环绕声。可以通过b:a参数进行设置。下面就来举几个例子:
ffmpeg -i iuput.wav -c:a libfdk_aac -b:a 128k output.m4a
根据这条命令可以看出,FFmpeg使用libfdk_aac将input.wav转为恒定码率为128kbit/s 编码为AAC的output.m4a音频文件。
ffmpeg -i input.m4a -c:v copy -c:a libfdk_aac -b:a 384k output.mp4
根据这条命令可以看出,FFmpeg将input.mp4的视频文件安装原有的编码方式进行输出封装,将音频以libfdk_aac进行编码,音频通道为环绕立体声,码率为384kbit/s,封装格式为output.mp。
以上两个例子均为使用libfdk_aac进行AAC编码的案例,使用libfdk_aac可以编码AAC的恒定码率(CBR)。
2.动态码率(VBR)模式
使用VBR可以有更好的音频质量,使用libfdk_aac进行VBR模式的编码的AAC编码时,可以设置5个级别。
根据下面表的内容,第一列为VBR的类型,第二列为每通道编码后的码率,第三列中有三种AAC编码信息,具体如下。
AAC编码基本参数
LC:Low Complexity AAC ,这种编码相对来说体积比较大,质量稍差
HE:High-Efficiency AAC,这种编码相对来说体积小,质量好
HEv2: High-Efficiency AAC version2 ,这种编码相对来说体积小,质量优
下面的表将列出LC,HE,Hev2的推荐参数。
AAC编码LC,HE,HEv2推荐参数
下面举个例子,将音频压缩为AAC编码的m4a容器:
ffmpeg -i input.wav -c:a libfdk_aac -vbr 3 output.m4a
执行完上述命令之后,FFmpeg会将input.wav的音频转为编码为libfdk_aac的output.m4a音频文件。
3.高质量AAC设置
根据前面的介绍,AAC音频分为三种LC,HE-AAC,HEv2-AAC,前为已经介绍过LC的编码设置,下面列举介绍HE-AAC与HEv2-AAC的设置。
1.HE-AAC音频编码设置
ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he -b:a 64k output.m4a
执行完上述命令行之后,编码后输出output.m4a的信息如下:
Output #0, ipod, to 'out.m4a':
Metadata:
encoded_by : Logic Pro X
date : 2016-04-12
coding_history :
time_reference : 158760000
umid : 0x00000000D0615BBB94340089A067295CFF7F0000F060130000000000000000000000000080C89C0401000000D0615BBB94340089905F295CFF7F0000EDAE8B8B
encoder : Lavf58.76.100
Chapters:
Chapter #0:0: start 0.000000, end 187.086621
Metadata:
title : Tempo: 127.0
Stream #0:0: Audio: aac (HE-AAC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp (24 bit), 64 kb/s
从以上代码可以看出,音频编码为HE-AAC,可见编码参数已通过-profile:a aac_he设置生效。
2. HEv2-AAC音频编码设置
执行如下命令:
ffmpeg -i input.wav -c:a libfdk_aac -profile:a aac_he_v2 -b:a 32k output.m4a
编码后输出output.m4a信息如下:
Output #0, ipod, to 'output.m4a':
Metadata:
encoded_by : Logic Pro X
date : 2016-04-12
coding_history :
time_reference : 158760000
umid : 0x00000000D0615BBB94340089A067295CFF7F0000F060130000000000000000000000000080C89C0401000000D0615BBB94340089905F295CFF7F0000EDAE8B8B
encoder : Lavf58.76.100
Chapters:
Chapter #0:0: start 0.000000, end 187.086621
Metadata:
title : Tempo: 127.0
Stream #0:0: Audio: aac (HE-AACv2) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp (24 bit), 32 kb/s
Metadata:
encoder : Lavc58.134.100 aac
size= 771kB time=00:03:07.08 bitrate= 33.8kbits/s speed= 151x
video:0kB audio:739kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.453330%
4. AAC音频质量对比
AAC_LC的音频编码可以采用libfaac,libfdk_aac,FFmpeg内置AAC三种,其质量顺序排列如下。
libfdk_aac音频编码质量最优
FFmpeg内置AAC编码次于libfdk_aac但优与libfaac
libfaac在ffmpeg内置AAC编码为实验品时是除了libfdk_aac之外的唯一选择
注意:在新版的FFmpeg中,libffack已经被删除