Opus Codec¶
Abstract |
Opus Codec |
Authors |
Walter Fan |
Status |
WIP |
Updated |
2021-12-29 |
概述¶
Opus 是一种实时交互音频编码, 设计用来满足在 RFC6366 中所提出的对互联网音频编码的需求. 不稳定的网络环境下的高质量语音通信.
Opus 由基于线性预测 (LP)的层和基于修正离散余弦变换 (MDCT)的层组成。
使用两层背后的主要思想是:对于语音,线性预测技术(如代码激励线性预测 CELP)的低频率编码比变换(例如,MDCT)域技术更加有效,而对于音乐和更高频率的语音,情况则正相反。
因此,具有两层可用的编解码器可操作范围比任何单个一层都大,将它们组合在一起比起单独使用任何一个能实现更好的质量。
本规范的主要规范部分由附录 A 中的源代码提供。只有该软件的解码器部分是规范的,尽管编码器和解码器共享大量代码。第 6 节提供了解码器一致性测试。解码器包含大量需要精确执行的整数和定点算术,包括所有舍入考虑,因此任何有用的规范都需要特定领域的符号语言来充分定义这些操作。此外,必须解决符号表示与包含的参考实现之间的任何冲突。出于兼容性和可测试性的实际原因,在任何分歧中给予参考实现优先级将是有利的。 C 语言也是机器行为的最广泛理解、人类可读的符号表示之一。由于这些原因,本 RFC 使用参考实现作为编解码器的唯一符号表示。
虽然符号表示是明确和完整的,但它并不总是理解编解码器操作的最简单方法。出于这个原因,本文档还以散文的形式描述了编解码器的重要部分,并借此机会解释了许多更令人惊讶的设计元素背后的基本原理。这些描述旨在准确和提供信息,但普通英语的局限性有时会导致歧义,因此预计读者将始终与符号表示一起阅读。为此提供了许多对实现的引用。这些描述有时在排序或数学简化方面与参考文献不同,只要这种偏差使解释更容易理解。例如,参考实现中的右移和左移操作在文本中经常使用除法和乘法来描述。一般来说,文本侧重于“什么”和“为什么”,而符号表示最清楚地提供了“如何”。
Opus可以处理各种音频应用,包括IP语音,视频会议,游戏内聊天,甚至远程现场音乐表演。它可以从低比特率窄带语音扩展到非常高质量的立体声音乐。支持的特性包括:
比特率从 6kb/s 到 510 kb/s
采样率从 8kHz(窄带)到 48kHz(全频段)
帧大小从 2.5ms 到 60ms
支持恒定比特率(CBR)和可变比特率(VBR)
从窄带到全频带的音频带宽
支持语音和音乐
支持单声道和立体声
支持多达255个通道(多流帧)
动态可调比特率,音频带宽和帧大小
良好的稳健性和隐蔽性
浮点和定点实现
互联网音频编码需求¶
术语¶
bitrate 比特每秒
complexity 复杂度从1到10,复杂度最高为10
signal_type 信号类型有 OPUS_AUTO, OPUS_SIGNAL_VOICE 或 OPUS_SIGNAL_MUSIC
audio_frame 以 opus_int16 或 float 数据类型的音频数据
frame_size 音频帧的长度,也是就所包含的采样数(per channel)
例如 48 kHz 所允许的值有 120, 240, 480, 960, 1920, 和 2880 传入一个小于 10 ms(以 48 kHz 为例是 480 个采样) 会阻止编码器使用 LPC 或混合模式
packet 音频数据包是一个包含压缩数据的字节数组
max_packet 最大数据包是指音频数据包可以包含的最大的字节数 (最大为 4000 字节).
不要使用 max_packet 来控制目标可变比特率,用 OPUS_SET_BITRATE 来代替
Opus Architecture¶
Opus 的整体架构
Opus Codec bandwidth¶
Opus 编码可从 6 kbit/s 窄带单声道语音扩展到 510 kbit/s 全带立体声音乐, 其算法延迟范围从5 ms 到 65.2 ms。在给定的时间,或者 LP 层,或者 MDCT 层,或者两者都有应用。它可无缝地在它的各种操作模式之间切换,这给它很大的灵活性来适应各种内容和网络条件,而无需重新协商当前的会话。
此编码允许输入和输出多种不同的音频带宽,定义如下:
Abbreviation |
Audio Bandwidth |
Sample Rate (Effective) |
---|---|---|
NB (narrowband) |
4 kHz |
8 kHz |
MB (medium-band) |
6 kHz |
12 kHz |
WB (wideband) |
8 kHz |
16 kHz |
SWB (super-wideband) |
12 kHz |
24 kHz |
FB (fullband) |
20 kHz (*) |
48 kHz |
Opus frame size and timestamp increments¶
Mode |
fs |
2.5 |
5 |
10 |
20 |
40 |
60 |
---|---|---|---|---|---|---|---|
ts incr |
all |
120 |
240 |
480 |
960 |
1920 |
2880 |
voice |
NB/MB/WB/SWB/FB |
x |
x |
o |
o |
o |
o |
audio |
NB/WB/SWB/FB |
o |
o |
o |
o |
x |
x |
Control Parameters¶
bitrate
channels
audio Bandwidth
frame duration
complexity
packetloss resilience
FEC
Constant/Variable bitrate
DTX
FEC¶
In-band Forward Error Correction (FEC)
Packets that are determined to contain perceptually important speech information, such as onsets or transients, are encoded again at a lower bitrate and this re-encoded information is added to a subsequent packet.
Discontinuous Transmission (DTX)¶
Discontinuous Transmission (DTX) reduces the bitrate during silence or background noise. When DTX is enabled, only one frame is encoded every 400 milliseconds.
内部分帧¶
Opus 编码打包到 RTP payload中,可以包含一个或几个帧 frame, 需要关注几个问题
operation mode
audio bandwidth
frame size
channel count
TOC¶
Opus 包必需包含最少一个字节,这个字节称为 TOC(Table Of Contents) 内容表,用来指示这个包所采用的模式和配置
0
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
| config |s| c |
+-+-+-+-+-+-+-+-+
Figure 1: The TOC Byte
前 5 个字节是 “config”, 它有最多 2^5=32 种配置,包括操作模式,音频带宽,和帧大小
LP(SILK) 和 MDCT(CELT)层可以组合在一起为三种可能的操作模式
SILK-only mode 用于低带宽连接的音频(wide-band或更低)
Hybrid mode (SILK + CELT) 用于超宽带 SWB 或全宽带 FB 在一个中等带宽
CELT-only mode 用于低延迟的语音或音乐传输(从窄带 NB 和全宽带 FB)
+-----------------------+-----------+-----------+-------------------+
| Configuration | Mode | Bandwidth | Frame Sizes |
| Number(s) | | | |
+-----------------------+-----------+-----------+-------------------+
| 0...3 | SILK-only | NB | 10, 20, 40, 60 ms |
| | | | |
| 4...7 | SILK-only | MB | 10, 20, 40, 60 ms |
| | | | |
| 8...11 | SILK-only | WB | 10, 20, 40, 60 ms |
| | | | |
| 12...13 | Hybrid | SWB | 10, 20 ms |
| | | | |
| 14...15 | Hybrid | FB | 10, 20 ms |
| | | | |
| 16...19 | CELT-only | NB | 2.5, 5, 10, 20 ms |
| | | | |
| 20...23 | CELT-only | WB | 2.5, 5, 10, 20 ms |
| | | | |
| 24...27 | CELT-only | SWB | 2.5, 5, 10, 20 ms |
| | | | |
| 28...31 | CELT-only | FB | 2.5, 5, 10, 20 ms |
+-----------------------+-----------+-----------+-------------------+
Table 2: TOC Byte Configuration Parameters
第 6 个比特标识为 “s”, 0 表示单声道,1表示立体声
剩余 2 个比特标识为 “c”, 表示每个包有几个帧
0: 1 frame in the packet
1: 2 frames in the packet, each with equal compressed size
2: 2 frames in the packet, with different compressed sizes
3: an arbitrary number of frames in the packet
Opus Decoder 解码¶
Range Decoder
SILK Decoder
Packet Loss Concealment
Configuration Switching
Opus Encoder 编码¶
Range Encoder
SILK Encoder
CELT Encoder
SDP¶
maxaveragebitrate
maxplaybackrate
minptime
stereo
cbr
useinbandfec
usedtx
sprop-maxcapturerate
sprop-stereo
API¶
Encodes an Opus frame.
// 创建编码器
OpusEncoder *opus_encoder_create(
opus_int32 Fs,
int channels,
int application,
int *error
)
// 修改编码器参数
int opus_encoder_ctl(
OpusEncoder *st,
int request, ...
)
// 创建解码器
OpusDecoder *opus_decoder_create(
opus_int32 Fs,
int channels,
int *error
)
// 将PCM编码成opus
opus_int32 opus_encode(
OpusEncoder *st,
const opus_int16 *pcm,
int frame_size,
unsigned char *data,
opus_int32 max_data_bytes
)
// 从opus中译码出PCM
int opus_decode(
OpusDecoder *st,
const unsigned char *data,
opus_int32 len,
opus_int16 *pcm,
int frame_size,
int decode_fec
)