本节摘要:Opus 把码率、带宽、帧长、复杂度四个维度全部做成逐帧可调的运行时参数,并用 CBR/VBR/CVBR 三种码率模式与 DTX 静音抑制覆盖不同网络环境。本节给出每个维度的档位表、配置原则与 libopus API 层面的实际用法。
3.2 节确定了"谁干活"(双引擎),本节确定"干多快、干多细"——四个维度构成 Opus 的参数空间,也是它"交互原生"性格的具体载体。第 5 章的选型与调参会直接引用本节的档位表。
码率:名义范围 6 至 510 kbps。实用分档:6–12 kbps 窄带语音极限档;16–24 kbps 常规通话档;32–64 kbps 高质量语音/音乐互动档;96–160 kbps 音乐分发档;256 kbps 以上接近透明。码率在 Opus 里是逐帧可写的参数——会议服务器可以根据接收端反馈实时下发新目标。
带宽:NB(约 4 kHz)→ MB → WB(8 kHz)→ SWB(12 kHz)→ FB(20 kHz)五档。编码器按码率与内容自动裁剪:码率不够时先砍带宽再降形状精度,保证"听得清"优先于"听得全"。这与 AAC-HE 的 SBR 路线方向相反——Opus 选择真实编码到某个截止频率,而非参数化伪造更高频段;两派听感差异在 4.2 节的场景分析里展开。
帧长:2.5/5/10/20/40/60 ms 六档。帧长是延迟与效率的兑换率:短帧延迟低但头开销与编码效率差;20 ms 是 VoIP 的事实默认;音乐档常用 20/40 ms 换效率。Opus 还允许把一包打多个帧(比如 3×20 ms 组一个 60 ms 包),在包开销与丢包粒度之间再做一次权衡。
复杂度:0–10 共十一档,控制编码器搜索努力程度——码本搜索深度、预测器阶数、码率分配迭代的精细度。高档位换质量、费 CPU;低档位为低端设备保实时。经验区间:移动端通话 4–6,服务器转码或高码率音乐 8–10。

CBR(恒定码率):每帧严格凑够目标比特(不足则填充)。带宽整形友好、计量简单,是 WebRTC 里最常见的默认。代价是静音段也在花钱。
VBR(变码率):按内容难度起伏,难帧多给、易帧少给,同平均码率下质量最好。文件分发与非实时场景首选。
CVBR(受限变码率):VBR 的质量优势加 CBR 的带宽约束——码率可变但被限制在滑动窗口平均值附近,兼顾运营商计量与会话质量。
三者的选择逻辑一句话可概括:网络侧要可预测选 CBR/CVBR,内容侧要质量选 VBR。会议系统普遍 CBR 或 CVBR,音乐平台普遍 VBR。
libopus 的 C API 直接暴露了全部四个维度,一个会话中参数可随时改写:
#include "opus.h" int err; OpusEncoder *enc = opus_encoder_create(48000, 1, OPUS_APPLICATION_VOIP, &err); /* 四维参数:码率 / 复杂度 / 帧长由调用节奏决定 / 带宽可强制 */ opus_encoder_ctl(enc, OPUS_SET_BITRATE(24000)); /* 码率 bps */ opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(6)); /* 复杂度 0-10 */ opus_encoder_ctl(enc, OPUS_SET_VBR(0)); /* 0=CBR 1=VBR */ opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_FULLBAND)); opus_encoder_ctl(enc, OPUS_SET_INBAND_FEC(1)); /* 3.4 节主角 */ opus_encoder_ctl(enc, OPUS_SET_DTX(1)); /* 静音抑制 */ unsigned char packet[400]; /* 每 960 样本(20 ms @48k)喂一次,帧长由喂入节奏决定 */ int nbytes = opus_encode(enc, pcm_960, 960, packet, sizeof(packet)); /* nbytes 为包大小:CBR 下几乎恒定,VBR 下随内容波动 */
三个工程要点:应用类型(VOIP/AUDIO/RESTRICTED_LOWDELAY)影响内部决策倾向,通话选 VOIP、音乐选 AUDIO、极限延迟选 LOWDELAY(禁用前瞻);带宽通常让编码器自决,强制指定多用于测试;码率切换在 CBR 下即刻生效、无爆音,这是会议系统动态调度的基石。
命令行侧(opusenc)对应关系:--bitrate、--comp、--framesize、--vbr/--cbr/--cvbr、--music/--speech(提示倾向)。做参数扫描实验时,把四维中的三维固定、扫一维,观察输出码率与听感变化,是最快的建立直觉的方法。
四维可调不等于随便调。三个典型误用:会议链路盲目上复杂度 10,中端手机发热降频,实时性反而崩——复杂度要跟着最弱终端走;音乐直播强行 CBR 32 kbps,编码器被迫持续丢形状精度,不如降到 24 kbps VBR 或升到 48 kbps;帧长压到 5 ms 但网络抖动大,抖动缓冲吃掉全部收益——端到端延迟要整体核算(5.4 节的预算表正是为此准备)。
四个维度的常用组合按场景收成一张速查表,供 5.1 契约设计时直接取用:
| 场景 | 码率 | 帧长 | 复杂度 | 码率模式与容错 |
|---|---|---|---|---|
| 常规视频会议 | 24–32 kbps | 20 ms | 4–6 | CBR,FEC 与 DTX 开 |
| 高质量互动课堂 | 48–64 kbps | 20 ms | 6–8 | CVBR,FEC 开 |
| 游戏语音(多并发) | 16–24 kbps | 20 ms | 3–5 | CBR,DTX 开 |
| 云游戏/合奏 | 128–256 kbps | 5–10 ms | 8–10 | VBR,FEC 关(可靠内网) |
| 弱网应急通话 | 8–12 kbps | 40 ms | 4 | CBR,FEC 最大档 |
| 语音识别上行 | 16 kbps | 20 ms | 5 | CBR,带宽可限 WB |
| 音乐互动直播 | 96–128 kbps | 20 ms | 8–10 | VBR |
| 服务器批量转码 | 按目标档 | 20–40 ms | 10 | VBR |
表里有两处反直觉的组合值得解释。弱网应急档用 40 ms 长帧:帧越长包越少、头部开销与丢包暴露面都更小——延迟让位给存活率,这是极端弱网下的正确取舍。语音识别上行主动限带宽到 WB:识别模型不需要 8 kHz 以上的频谱,省下的码率换成更低的 RTT 与更稳的传输,识别准确率反而受益。
⚠️ 常见坑:带宽档与采样率混淆。Opus 内部统一 48 kHz 时钟,"NB/WB"是编码带宽不是采样率——48 kHz 采样的输入照样可能只被编出 4 kHz 带宽(码率太低时)。排查"声音发闷"先看实际编码带宽(opusinfo 或解码统计可查),别急着怪采样率。
💡 关键直觉:四个维度里,码率是"预算"、带宽是"覆盖面"、帧长是"节奏"、复杂度是"努力程度"。配置 Opus 就是回答四个问题:给多少钱、覆盖多少频段、多快交货、干得多认真。
下一节专讲坏网络下的生存术:FEC、DTX 与丢包隐藏如何在码流内部消化丢包。