Depth.Love Blog

GitHub:https://github.com/depthlove

0%

利用fdk-aac将iOS麦克风实时音频流编码为aac文件

近几天终于有点空闲时间写写东西了,将之前项目中自己做的东西更新上来,写写自己的心得感想。

iOS系统上的音频硬编码器,可实现将pcm音频数据编码为aac格式的数据。但是,对于低码率下的音频编码,就是它的软肋了。通过函数扫描iOS各系统上音频硬编码支持的情况发现,aac-lc编码都是支持的,苹果的官方文档也说的很清楚。对于aac-he-v2编码,iOS现在所有的系统都不支持,aac-he编码需要iOS9.0以上系统才支持音频硬编码。

做直播的时候,利用iOS的音频硬编码器可以将码率降到80Kb/s,用128Kb/s虽然可以让音质更好,但有点浪费带宽,当主播的网络状况不好时,这就成了一个影响观众流畅观看的一个负面因子,一般选用96Kb/s的码率,这个码率在现今国内网络条件下,还是显得有那么点大。为降低码率同时保证音频音质的情形下,选择合适的编码器才是在有限带宽下优化直播体验的最好武器。

音频编码器有很多,比如常见的有faac,vo_aacenc,fdk-aac,以及ffmpeg自带的音频编码器。ffmpeg3.0及之后的版本都已经移除了对faac,vo_aacenc的支持,对于ffmpeg3.0之后版本音频编码器的支持情况可以看看它的官网说明,从官网上看,ffmpeg组织建议使用他们的原生native音频编码器,可见,ffmpeg自带的编码器还是不错的。但是,为了一个音频编码功能引入一个这么强壮且庞大的库,有点不划算,虽然可裁剪ffmpeg,也可以将fdk-aac编译进ffmpeg中,但是如果应用中引入了基于ffmpeg开发的播放器的时候,ffmpeg库冲突的情形可能会出现。再说,有比ffmpeg原生音频编码器更好的fdk-aac音频编码器存在,就不需要考虑ffmpeg了,即便用ffmpeg做编码很方便。因为我们是用ffmpeg时间长了,就习惯依赖于ffmpeg了。

fdk-aac音频编码器用起来也很简单,跟单独用faac差不多,但比faac编码效果好。使用fdk-aac实现了aac-lc,aac-he,aac-he-v2 采样率为44.1KHz,通道数为2(立体声),码率为32Kb/s的aac编码。