音频编解码器 · Opus 与它的超能力

WebRTC 音频几乎都用 Opus——一个万能编解码器:码率 6 到 510 kbps 无级可调、内建 FEC 抗丢包、静音时 DTX 省带宽、语音音乐通吃。这一章讲清 Opus 的这些超能力、AudioEncoder/AudioDecoder 抽象,以及为什么它是实时音频的理想选择。

作者 David更新于 第 64 篇(共 112 篇)

音频编解码器 · Opus 与它的超能力

音频要传,先得压缩。WebRTC 支持几种音频编解码器,但主力几乎只有一个——Opus。它是为实时通信量身打造的“万能编解码器”,一身超能力。这一章看它,以及音频编解码器的抽象。

AudioEncoder / AudioDecoder 抽象

和视频一样,音频编解码器藏在统一抽象后:AudioEncoder / AudioDecoder(api/audio_codecs/)。上层ACM 只面对这个接口,不关心具体是 Opus 还是 G.711。编解码器由工厂(可在依赖里替换)创建,SDP 协商时取交集决定用哪个。抽象让 WebRTC 能支持多种编解码器,但实践中——Opus 一枝独秀。

Opus:一个顶一堆

Opus(RFC 6716)是 IETF 标准的开源编解码器,几乎是实时音频的标准答案:

Opus 的超能力,是“万能 + 自适应”:一个编解码器覆盖从窄带语音到高保真音乐的全部场景,且几乎每个参数都能实时调。

  • 码率无级可调(6~510 kbps) —— 从几 kbps 的能听清的语音,到几百 kbps 的高保真音乐,同一个编解码器平滑覆盖。拥塞控制一变码率,Opus 立刻跟着调,无需换编解码器。
  • 语音 + 音乐通吃 —— 内部融合了两种技术(语音用 SILK、音乐 / 高频用 CELT),自动适配内容。开会说话、放段音乐,它都行。
  • 低延迟 —— 帧长可低至几毫秒,适合实时对话。
  • 内建 FEC —— in-band FEC:在下一个包里编码一份上一个包的低码率副本。丢一个包,下一个包里带着它的备份,直接补上——音频抗丢包的利器,无需额外的 FEC 流。
  • DTX(不连续传输) —— 你不说话时(静音),Opus 停止发送或只发极少的“舒适噪声”参数,省下大量带宽。会议里大部分时间你在听不在说,DTX 就一直在省。

一个 Opus,把“该多清晰、抗不抗丢包、静音省不省”全包了——这种全能和自适应,正是实时通信要的。所以 WebRTC 里音频编解码协商几乎总是选 Opus。

老兵:G.711

WebRTC 也支持 G.711(PCMU / PCMA,即 μ-law / A-law)——最老的数字语音编解码器(1972 年!),固定 64 kbps、几乎不压缩、静态 payload type。它音质一般、费带宽,但兼容一切(所有电话系统都懂),所以留作和传统电话网(PSTN)互通的保底。日常 WebRTC 通话不会用它,但和电话网关对接时它是通用语。

音频编码的特点:小、密、弱依赖

对比视频,音频编码有几个决定后续设计的特点:

“包小、密、弱依赖”这三个特点,直接塑造了音频接收侧的设计。 正因为丢一个包只毁 20ms、且语音短时可预测,音频才能玩丢包隐藏(PLC)——编造那 20ms 以假乱真的填充;正因为包密而小,音频才能做精细的时间伸缩(拉伸 / 压缩几毫秒)来微调播放节奏。这些精细手段的舞台,就是下面要讲的 NetEq。编解码器的特性,决定了抖动缓冲的玩法——音频和视频在这里彻底分道。

小结与下一章

音频编解码器藏在 AudioEncoder/AudioDecoder 抽象后,协商取交集——而主力几乎只有 Opus:码率 6~510 kbps 无级可调、语音音乐通吃、低延迟、内建 in-band FEC(下包带上包副本抗丢包)、DTX(静音省带宽)。G.711 老而全兼容,留作和电话网互通的保底。音频编码“包小、密、弱依赖”的特点,让接收侧能玩丢包隐藏和时间伸缩——这是和视频分道的根本。

编解码器接进来,由 ACM 统管。下一章看 ACM。👉 ACM 音频编码模块。

参考资料

  • [1] libwebrtc 源码.api/audio_codecs/audio_encoder.h、audio_decoder.h、modules/audio_coding/codecs/opus/。
  • [2] IETF RFC 6716「Opus」、RFC 3551「G.711」。
  • [3] Opus 项目.https://opus-codec.org/

本页目录