【音视频】iOS AudioConverter + Android MediaCodec 双端封装

【音视频】iOS AudioConverter + Android MediaCodec 双端封装

💡 原文中文,约25000字,阅读约需60分钟。
📝

内容提要

本文探讨音频编码中常被忽视的问题,指出AAC默认参数导致延迟高、文件大及低端设备爆音。对比AAC-LC与Opus特性,推荐按场景选型,并提供用Claude Code生成的iOS和Android双端AAC编码封装代码,涵盖参数配置、错误处理及Opus跨平台实现,强调实时通话应优先采用Opus以降低延迟和码率。

🔎

延伸解读

默认参数陷阱

文章指出,许多开发者在优化视频编码后,却忽略了音频编码的默认参数,导致VoIP延迟高、文件体积大、低端机爆音等问题。这提醒我们,音频编码参数的选择对应用体验有直接影响,不应被忽视。

选型需按场景

文章对比了AAC-LC与Opus的特性,并给出了不同场景下的推荐。例如,短视频录制适合AAC-LC,而实时通话应优先选择Opus,因为其延迟更低、码率更省。开发者应根据实际需求选择合适的编码器,而非盲目使用默认设置。

跨平台封装要点

文章提供了iOS AudioConverter和Android MediaCodec的封装代码,并强调了错误处理、参数配置和调试信息的重要性。例如,Android端需注意ADTS头的添加,iOS端需处理AudioConverter回调的异常。这些细节对保证编码稳定性至关重要。

Q&A

为什么音频编码使用默认参数会导致延迟高、文件大和低端设备爆音?

默认参数通常使用AAC编码,其延迟较高(40-60ms),码率效率中等,导致文件体积大;在低端Android设备上,AAC硬编可能产生噪声,且未针对场景优化,导致爆音等问题。

AAC-LC和Opus在延迟、码率和兼容性方面有何区别?

AAC-LC延迟40-60ms,码率效率中等,兼容性最好,硬件编码普遍;Opus延迟最低(5ms),码率覆盖广(6-510kbps),语音和音乐通吃,但iOS硬编不支持,兼容性不如AAC-LC。

实时通话场景推荐使用哪种编码器?为什么?

推荐使用Opus,因为其延迟低(5ms),语音码率仅需24-40kbps,相比AAC可节省50%码率,且质量更好。

iOS端使用AudioConverter进行AAC编码时,如何设置码率和质量?

通过AudioConverterSetProperty设置kAudioConverterEncodeBitRate为码率值(如128000),设置kAudioConverterCodecQuality为0x60(高质量推荐值)。

Android端MediaCodec异步模式编码AAC时,如何处理输出Buffer?

在onOutputBufferAvailable回调中,获取输出Buffer,读取数据,然后必须调用codec.releaseOutputBuffer(index, false)释放Buffer。

Opus编码器在VOIP场景下推荐开启哪些功能?

推荐开启带内前向纠错(FEC)、静音检测(DTX)和设置预期丢包率(如10%),并使用CBR模式(VBR=0)以保证稳定性。

MediaCodec输出的AAC数据没有ADTS头,如何添加?

可以手动添加7字节的ADTS头,根据采样率和声道数计算采样率索引和帧长度,然后拼接在AAC帧前。文章提供了addADTSHeader函数示例。

AAC-LC在音乐录制场景下有什么缺点?

AAC-LC的截止频率为16kHz,高频乐器和镲片会被削平,导致音乐细节丢失。

🏷️

标签

➡️

继续阅读