SIP终端Opus编解码器集成与媒体协商深度技术报告:架构设计、SDP规范与RTP实现指南
1. 执行摘要与架构背景
随着VoIP(Voice over IP)技术的不断演进,传统的窄带语音通信正逐渐向全带高清(Fullband HD)音频通信转型。在现有的SIP终端架构中,通常已经集成了传统的G.711 A-law(PCMA)和G.729编解码器。G.711作为PSTN时代的遗留标准,提供无压缩的窄带语音;而G.729则代表了早期的低带宽压缩技术。然而,面对现代网络环境对音质、抗丢包能力和带宽适应性的更高要求,引入Opus编解码器已成为必然趋势。
本报告旨在为SIP终端开发人员和系统架构师提供一份详尽的实施指南,重点解决用户提出的核心技术挑战:如何在支持G.711A和G.729的基础上引入Opus,特别是如何处理Opus在“48kHz 16-bit整数采样”与“48kHz 32-bit浮点采样”两种格式下的媒体协商与RTP传输问题。
1.1 编解码器演进与Opus的技术优势
传统的音频编解码器通常分为两类:波形编解码器(如G.711)和参数编解码器(如G.729)。Opus的出现打破了这一界限,它基于RFC 6716标准,融合了Skype的SILK(用于语音的线性预测编码)和Xiph.Org的CELT(用于音乐的改进离散余弦变换)两种技术核心。
Opus的核心优势在于其极高的灵活性:
- 动态带宽调整:支持从窄带(8kHz)到全带(48kHz)的无缝切换。
- 极低延迟:算法延迟可低至5ms,远优于G.729的15ms+。
- 内置抗丢包机制:支持带内前向纠错(In-band FEC),在丢包率高达20%的网络中仍能保持可懂度。
1.2 核心架构挑战:采样格式的解耦
用户特别提到的“48K 16Bit整数”与“48K 32Bit浮点”是本次集成的关键误区所在。在传统的TDM(时分复用)或早期的VoIP开发中,由于硬件DSP的限制,网络传输格式往往与本地音频接口格式强耦合(例如G.711直接对应8kHz 8-bit A-law PCM)。
然而,Opus的设计理念是**“网络传输与本地呈现解耦”。RFC 7587明确规定,Opus在SDP(会话描述协议)中的信令时钟频率必须固定为48000 Hz,且通道数必须**为2(即使是单声道传输)4。这意味着,无论终端内部使用16位整数还是32位浮点数进行音频处理,网络层面的协商参数是统一且标准化的。两种采样格式的区别仅存在于接收端解码后的应用层API调用阶段,而非SDP协商阶段。
—
2. 媒体协商策略:SDP Offer/Answer模型深度解析
在SIP通信中,媒体能力的协商遵循RFC 3264定义的Offer/Answer模型。当在已有的G.711/G.729终端中加入Opus时,SDP(Session Description Protocol)的构建变得尤为关键,因为它不仅决定了编解码器的优先级,还决定了具体的传输参数。
2.1 媒体行(m-line)与编解码器优先级设计
m=行定义了媒体类型、端口、传输协议以及优先使用的负载类型列表。在设计支持Opus的终端时,必须考虑到Opus的高清特性,将其置于优先级列表的首位,同时保留G.711和G.729作为回退选项。
负载类型(Payload Type, PT)的选择策略:
- 静态负载类型:G.711A(PCMA)由IANA分配了固定的PT值8;G.729分配了固定的PT值18。
- 动态负载类型:Opus没有分配静态PT值,必须使用动态范围(96-127)内的值。通常建议选择96到127之间的未占用值,如111或100,以避免与RFC 2833/4733的DTMF事件(通常也是动态分配)冲突。
推荐的SDP m=行配置:
代码段
m=audio 12345 RTP/AVP 111 8 18 101
此配置明确表达了终端的偏好顺序:
- 111 (Opus):首选,提供全带高清音质。
- 8 (PCMA):次选,提供PSTN级音质,计算开销极低。
- 18 (G.729):末选,提供带宽节省(8kbps),但音质一般。
- 101 (telephone-event):用于带外传输DTMF信号。
2.2 a=rtpmap 属性详解:48kHz规则的绝对性
在Opus的集成中,最常见的错误是在SDP中试图协商实际的音频采样率(如16000Hz或32000Hz)。这是严格禁止的。
根据RFC 7587第7节,Opus的RTP时钟频率在SDP中必须始终声明为48000 Hz。这与终端内部实际处理的采样率(无论是16k还是48k)无关,也与RTP包内实际编码的音频带宽无关。
SDP映射表:
| 编解码器 | 负载类型 (PT) | rtpmap配置字符串 | 说明 |
|---|---|---|---|
| Opus | 111 (动态) | a=rtpmap:111 opus/48000/2 | 注意:即使是单声道通话,通道数也必须写2;时钟必须写48000。 |
| G.711A | 8 (静态) | a=rtpmap:8 PCMA/8000 | 传统8kHz窄带。 |
| G.729 | 18 (静态) | a=rtpmap:18 G729/8000 | 传统8kHz窄带。 |
| DTMF | 101 (动态) | a=rtpmap:101 telephone-event/8000 | DTMF时钟通常需匹配音频时钟,但对于Opus,DTMF通常仍维持8000或48000。 |
深度解析“/2”参数:
SDP中的opus/48000/2后缀表示Opus解码器默认支持立体声解码。对于单声道应用,Opus解码器能够智能地处理立体声流并下混(Downmix)为单声道输出,或者将单声道流上混(Upmix)。因此,不需要在rtpmap中修改此参数来适应单声道硬件。
2.3 a=fmtp 属性:精细化协商与参数调优
如果说rtpmap是基础握手,那么fmtp(Format Parameter)就是Opus性能调优的核心。针对用户提出的“48K”高采样率需求,我们需要通过fmtp参数向对端准确通告本端的能力和偏好。
2.3.1 控制采样率上限:maxplaybackrate 与 sprop-maxcapturerate
虽然RTP时钟固定为48kHz,但实际音频信号的有效带宽是可以协商的。
- maxplaybackrate(最大回放速率):
- 定义:通知对端,“我这边的扬声器或DSP处理能力最高支持到什么频率”。
- 设置建议:由于用户明确要求“48K”采样,这意味着终端具备全带(Fullband)回放能力。因此,建议设置maxplaybackrate=48000。如果未设置,默认值也是48000。但显式声明有助于防止对端错误地降级为宽带(16kHz)模式。
- 场景举例:如果这是一个桌面话机,受限于硬件受话器只能播放16kHz音频,那么应设置maxplaybackrate=16000以节省带宽。但对于用户的48K需求,必须设为48000。
- sprop-maxcapturerate(最大捕获速率建议):
- 定义:通知对端,“我这边的麦克风输入大概率会发送什么带宽的音频”。
- 设置建议:设置为48000。这向对端暗示本端将发送高质量全带音频,对端应准备好相应的解码资源(如全带回声消除器资源)10。
2.3.2 带宽管理:maxaveragebitrate
Opus支持从6kbps到510kbps的超大范围比特率。如果不加限制,某些编码器可能会为了追求极致音乐音质而使用过高的比特率,导致网络拥塞,进而影响实时性。
- 设置建议:对于48kHz的全带语音通信,通常24kbps 到 32kbps是质量与带宽的最佳平衡点(Sweet Spot)。
- 配置:maxaveragebitrate=32000。此参数是接收端参数,意为“请不要发送超过32kbps的平均码率给我”。
2.3.3 立体声与单声道:stereo 与 sprop-stereo
用户提到的“48K 16Bit/32Bit”通常暗示了对高音质的追求。在VoIP中,通常默认是单声道(Mono)。
- stereo=1:告诉对端“我倾向于接收立体声”。如果用户的终端是会议终端或支持空间音频的软终端,应开启此项。如果是手持话机,应设为0。
- sprop-stereo=1:告诉对端“我发送的流可能是立体声”。
- 注意:即使设置为立体声,RTP时钟依然是48000,且rtpmap中的通道数依然是/2。stereo参数仅影响解码器输出的声道布局偏好。
2.3.4 抗丢包与非连续传输:useinbandfec 与 usedtx
这是Opus相对于G.711/G.729最大的优势所在。
- useinbandfec=1:强烈建议开启。这会激活Opus的带内前向纠错(Forward Error Correction)。当网络发生丢包时,解码器可以利用后续数据包中携带的冗余信息恢复丢失的音频帧。这对于保证48kHz高清语音的连续性至关重要。
- usedtx=0:DTX(非连续传输)类似于G.729 Annex B的VAD。在静音期间停止发送RTP包。
- 建议:在追求高音质和NAT穿透稳定性时,建议设为0(关闭)。关闭DTX可以保持RTP流的连续性,有助于维持防火墙端口映射,并避免静音检测算法误切微弱的背景音。仅在带宽极度受限(如卫星链路)时开启。
2.4 完整的SDP Offer构建示例
结合上述分析,针对用户“48K采样、支持Opus/G711/G729”的需求,标准的SDP Offer应如下编写:
代码段
v=0
o=UserTerminal 1001 1001 IN IP4 192.168.1.10
s=SIP Call
c=IN IP4 192.168.1.10
t=0 0
m=audio 16384 RTP/AVP 111 8 18 101
a=rtpmap:111 opus/48000/2
a=fmtp:111 maxplaybackrate=48000; sprop-maxcapturerate=48000; maxaveragebitrate=32000; useinbandfec=1; usedtx=0; stereo=0; sprop-stereo=0
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=yes
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20
a=sendrecv
注:fmtp:18 annexb=yes 显式声明了G.729对Annex B(VAD)的支持,这对于与Cisco或Oracle SBC互通非常重要。
—
3. 实现指南:解决“16-bit整数”与“32-bit浮点”的双重需求
用户提问的核心难点在于:“现在实现Opus,两种格式:48K 16Bit整数采样和48K 32Bit浮点采样。如何进行媒体协商?”
技术结论:这两种格式不在SDP中协商,而是在接收端的API调用层面进行区分。
3.1 传输层与应用层的解耦原理
在RTP数据包中,Opus负载是一段经过高压缩的熵编码比特流(Bitstream)。这段比特流不包含任何关于“解码后应该是整数还是浮点数”的信息。它只包含频域系数、线性预测系数等数学表达。
当SIP终端接收到RTP包并提取出Opus负载后,解码器(通常是libopus库)负责将这些压缩数据还原为PCM音频。此时,应用层代码决定调用哪个API函数来获取何种格式的数据。
3.2 libopus API 调用详解
根据libopus官方文档,解码器提供了两套并行的接口,这正是满足用户双重格式需求的关键。
场景一:48K 16-bit 整数采样
这种格式通常用于直接驱动硬件DAC(数模转换器),或者与传统的音频混音引擎(如Linux的ALSA默认模式)对接。
- API函数:opus_decode()
- 输入:Opus编码的字节流。
- 输出:opus_int16 类型的数组(即标准的short类型,范围-32768到32767)。
- 代码逻辑示例:
C
opus_int16 pcm_output[960 * channels]; // 960 samples for 20ms at 48kHz
int samples_decoded = opus_decode(decoder_state, payload_data, payload_len, pcm_output, 960, 0);
// 此时 pcm_output 中存放的就是 48K 16Bit 整数数据
场景二:48K 32-bit 浮点采样
这种格式通常用于现代软件音频处理管线(如PulseAudio, PipeWire, Android AudioFlinger),或者用于后续的高级信号处理(如WebRTC的回声消除AEC、自动增益控制AGC)。浮点数提供了极大的动态范围,避免了混音过程中的削波失真。
- API函数:opus_decode_float()
- 输入:Opus编码的字节流。
- 输出:float 类型的数组(范围通常归一化在-1.0到+1.0之间)。
- 代码逻辑示例:
C
float pcm_float_output[960 * channels];
int samples_decoded = opus_decode_float(decoder_state, payload_data, payload_len, pcm_float_output, 960, 0);
// 此时 pcm_float_output 中存放的就是 48K 32Bit 浮点数据
3.3 终端内部的架构设计建议
为了同时支持这两种格式,建议在SIP终端的媒体引擎层设计一个抽象层:
- 协商阶段:SIP栈通过SDP协商确定使用Opus编解码器(Payload Type = 111)。
- 初始化阶段:媒体引擎初始化OpusDecoder。注意,解码器状态结构体OpusDecoder*对于整数和浮点解码是通用的,不需要初始化两个不同的解码器。
- 运行时决策:
- 查询音频输出模块的配置。如果是直接写入/dev/dsp或I2S接口,选择整数路径。
- 查询音频处理链。如果启用了软件AEC算法(通常基于浮点运算),选择浮点路径。
- 该决策可以是动态的,例如插入耳机时使用高保真浮点路径,免提模式使用整数路径。
—
4. RTP传输层架构与负载填充
在完成协商和编解码器初始化后,下一步是正确封装RTP数据包。这是互操作性问题的重灾区。
4.1 RTP头部构建规范
RTP头部由RFC 3550定义,长度为12字节。针对Opus,各字段的填充有特定要求。
| 字段 | 位宽 | 值/逻辑 | 说明 |
|---|---|---|---|
| V (Version) | 2 | 2 (10二进制) | 固定版本号。 |
| P (Padding) | 1 | 0 | 通常无填充。 |
| X (Extension) | 1 | 0 | 除非使用Header Extensions(如音量指示),否则为0。 |
| CC (CSRC Count) | 4 | 0 | 点对点通话通常为0。 |
| M (Marker) | 1 | 逻辑控制 | 在通话开始的第一帧,或DTX静音结束后的第一帧置为1;其余为0。 |
| PT (Payload Type) | 7 | 动态值 (e.g., 111) | 必须与SDP Answer中协商确定的值一致。如果对方SDP回复的是96,这里就填96。 |
| Sequence Number | 16 | 递增计数 | 每发一个包加1。用于检测丢包。 |
| Timestamp | 32 | 48kHz时钟递增 | 核心关键点。见下文详述。 |
| SSRC | 32 | 随机数 | 标识同步源,整个会话期间保持不变。 |
4.2 时间戳(Timestamp)计算的数学原理
Opus的时间戳计算是开发者最容易出错的地方。必须牢记:Opus RTP时间戳永远基于48000 Hz时钟递增,无论实际音频带宽是多少。
用户可能会疑惑:“如果我为了节省带宽,Opus内部降级到了12k或16k带宽,时间戳是否应该按16k递增?”
答案是否定的。
计算公式:
KaTeX parse error: Expected group as argument to '\=' at position 22: …ta Timestamp \= ̲\\text{FrameDur…
常见帧长对应的时间戳增量表:
| 帧长 (ptime) | 音频采样点数 (48k) | RTP时间戳增量 | 备注 |
|---|---|---|---|
| 10 ms | 480 | 480 | 低延迟模式。 |
| 20 ms | 960 | 960 | VoIP标准默认值。 |
| 40 ms | 1920 | 1920 | 高效率模式,减少IP头开销。 |
| 60 ms | 2880 | 2880 | 极高效率,但延迟较大。 |
错误案例分析:
假设终端内部运行在Wideband模式(16kHz),每帧20ms包含320个采样点。如果开发者错误地将RTP时间戳增加320,接收端(如WebRTC客户端或标准SBC)会认为数据包发送得太慢(即认为是KaTeX parse error: Expected group as argument to '\=' at position 13: 320/48000 \= ̲6.6\\text{ms}的数据),导致播放缓冲下溢(Underrun),声音出现卡顿或加速播放的现象。
4.3 负载数据(Payload)的填充
RTP头部之后紧跟的就是Opus Payload。这里不需要像G.729那样考虑字节对齐或位填充,直接将opus_encode输出的字节数组拷贝进去即可。
- 最大传输单元(MTU)考量:Opus包通常很小(几十到几百字节),不会超过以太网MTU(1500字节)。
- VBR(可变比特率)特性:Opus默认是VBR的。这意味着连续的RTP包,其Payload长度是变化的(例如静音时很短,大声说话时较长)。RTP Payload Type字段不需要因为长度变化而改变。
—
5. 传统编解码器共存与互操作性方案
用户的终端必须同时支持G.711A和G.729。在引入Opus后,系统必须处理复杂的互操作场景,特别是当对端不支持Opus时的回退机制。
5.1 G.729 Annex B 的陷阱与规避
G.729标准包含多个附件,其中Annex B定义了VAD(语音活动检测)和CNG(舒适噪声生成)。在SDP协商中,annexb参数至关重要。
- 默认行为:根据RFC 4856,如果SDP中未包含annexb参数,默认视为annexb=yes(支持Annex B)18。
- 互通风险:某些老旧的软交换或网关可能不支持Annex B(即只支持连续发送的G.729A)。如果本端默认开启Annex B并发包含有SID(Silence Insertion Descriptor)帧的流,对端可能会视为非法包丢弃,导致单通。
- 解决方案:
- 在SDP Offer中显式携带a=fmtp:18 annexb=yes。
- 如果SDP Answer中对端回复annexb=no,或者没有任何fmtp参数但实际媒体流表现出不支持SID帧,本端DSP应能够动态关闭VAD功能,回退到G.729A模式。
5.2 转码(Transcoding)与采样率转换
由于Opus固定为48kHz,而G.711/G.729固定为8kHz,终端内部必须具备重采样(Resampling)能力。
架构建议:
为了简化设计,建议终端的音频核心(Audio Core)统一运行在48kHz。
- 呼叫建立为Opus (111):
- MIC (48k) -> Opus Encoder (48k) -> RTP
- RTP -> Opus Decoder (48k) -> Speaker (48k)
- 无重采样,音质最优。
- 呼叫建立为G.711 (8):
- MIC (48k) ->Downsampler (48k to 8k)-> G.711 Encoder -> RTP
- RTP -> G.711 Decoder ->Upsampler (8k to 48k)-> Speaker (48k)
- 虽然经过重采样,但保持了系统时钟统一。
这种“全时48k”架构完美契合用户提出的“48K Int/Float”需求,使得底层驱动不需要在通话切换时重置硬件参数,避免了爆音(Pop noise)风险。
—
6. 高级特性调试与故障排查
在集成Opus的过程中,通过抓包分析是解决问题的最有效手段。以下是基于Wireshark的调试指南。
6.1 Wireshark抓包分析要点
- 检查SDP协商:
- 过滤 sip。
- 查看INVITE消息体。确认m=行是否包含111,rtpmap是否为opus/48000/2。
- 检查对端200 OK。确认对端是否选择了111。如果对端选择了8(PCMA),说明协商回退,检查是否是因为本端SDP格式错误导致对端无法识别Opus。
- 检查RTP流:
- 过滤 rtp。
- Payload Type:是否为协商的动态值(如111)。如果看到PT=111但Wireshark显示“Unknown”,右键点击数据包 -> Decode As -> RTP -> 将111映射为Opus。
- Timestamp Increment:选中两个连续的数据包,计算Timestamp差值。如果是20ms帧,差值必须严格为960。如果差值是320或160,说明RTP时钟实现错误。
- Payload Size:Opus包的大小应该在波动(VBR)。如果大小完全固定,检查是否误开启了CBR模式(cbr=1)。
6.2 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 声音变调(像花栗鼠) | 采样率不匹配 | 检查RTP时间戳增量是否错误地使用了8000或16000。Opus必须按48000递增。 |
| 单通(有去无回) | NAT穿越失败或PT不匹配 | 检查SBC是否修改了Payload Type。SDP Offer和Answer中的动态PT值可能不同,发送RTP时必须使用对方SDP中指定的PT。 |
| 音质无明显提升 | 带宽限制或G.711瓶颈 | 检查是否协商回退到了G.711。或者maxaveragebitrate设置过低(如<12kbps)。 |
| G.729通话断续 | VAD/CNG不兼容 | 检查SDP中annexb参数。尝试强制关闭G.729的VAD功能。 |
| Opus解码失败 | 浮点/整数误用 | 确保调用opus_decode_float时传入的是float数组指针,而不是short指针。C语言中这会导致严重的内存访问错误或噪声。 |
—
7. 结论
在现有的SIP终端中集成Opus编解码器,是提升通信体验的关键一步。通过本文的分析,我们明确了以下核心实施原则:
- 坚持标准:严格遵守RFC 7587,SDP中Opus时钟必须声明为48000,通道数为2。
- 解耦设计:认识到网络侧的协商(48k)与本地处理(Int16/Float32)是解耦的。利用libopus的双API特性来满足用户特定的采样格式需求。
- 精细协商:利用fmtp参数优化带宽与质量的平衡,特别是maxaveragebitrate和useinbandfec的配置。
- 统一架构:建议终端音频引擎统一运行在48kHz,通过软件重采样兼容G.711/G.729,从而简化硬件控制逻辑。
遵循本报告提供的SDP范例和RTP实现规范,开发团队可以构建出既兼容传统PSTN网络,又具备现代互联网高清语音能力的健壮SIP终端。
引用的著作
- RFC 7587 - RTP Payload Format for the Opus Speech and Audio …, 访问时间为 十二月 13, 2025, https://datatracker.ietf.org/doc/html/rfc7587
- Opus and Session Initiation Protocol Security in Voice over IP (VOIP), 访问时间为 十二月 13, 2025, https://www.ej-eng.org/index.php/ejeng/article/download/1625/711/6585
- FreeSWITCH And The Opus Audio Codec, 访问时间为 十二月 13, 2025, https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-opus/FreeSWITCH-And-The-Opus-Audio-Codec_12517398/
- Configure Asterisk to accept incorrectly formatted opus rtpmap, 访问时间为 十二月 13, 2025, https://community.asterisk.org/t/configure-asterisk-to-accept-incorrectly-formatted-opus-rtpmap/104974
- Configuring OPUS 16 Negotiation with Grandstream Endpoints using PJSIP on Asterisk 20.11.0, 访问时间为 十二月 13, 2025, https://community.asterisk.org/t/configuring-opus-16-negotiation-with-grandstream-endpoints-using-pjsip-on-asterisk-20-11-0/105825
- RFC 3264: An Offer/Answer Model with Session Description Protocol (SDP), 访问时间为 十二月 13, 2025, https://www.rfc-editor.org/rfc/rfc3264.html
- Modern Video-Conferencing Systems: Understanding SDP Offer/Answer Negotiation, 访问时间为 十二月 13, 2025, https://blog.webex.com/engineering/understanding-sdp-offer-answer-negotiation/
- Real-Time Transport Protocol (RTP) Parameters - Internet Assigned Numbers Authority, 访问时间为 十二月 13, 2025, https://www.iana.org/assignments/rtp-parameters
- How to Negotiate OPUS Dynamic Codec IDs with sipp Scenarios - Sipfront, 访问时间为 十二月 13, 2025, https://sipfront.com/blog/2023/09/sipp-and-opus-negotiating-a-dynamic-codec-id/
- Opus negotiation for the practical man - Giacomo Vacca, 访问时间为 十二月 13, 2025, https://www.giacomovacca.com/2016/09/opus-negotiation-for-practical-man.html
- DTMF telephone-events over Opus should be sent with 48000 Hz [42230252] - WebRTC, 访问时间为 十二月 13, 2025, https://issues.webrtc.org/42230252
- Modern Video-Conferencing Systems: Understanding Attributes of the Session Description Protocol | Webex Blog, 访问时间为 十二月 13, 2025, https://blog.webex.com/engineering/understanding-session-description-protocol-attributes/
- Opus Codec Transcoding Support - Oracle Help Center, 访问时间为 十二月 13, 2025, https://docs.oracle.com/en/industries/communications/session-border-controller/9.0.0/configuration/opus-codec-transcoding-support.html
- RTP Payload Format and File Storage Format for Opus Speech and Audio Codec - IETF, 访问时间为 十二月 13, 2025, https://www.ietf.org/archive/id/draft-spittka-payload-rtp-opus-00.html
- Opus inband FEC and other parameters · Issue #252 · w3c/ortc - GitHub, 访问时间为 十二月 13, 2025, https://github.com/w3c/ortc/issues/252
- Linphone opus codec sampling rate - Stack Overflow, 访问时间为 十二月 13, 2025, https://stackoverflow.com/questions/60580526/linphone-opus-codec-sampling-rate
- How to set up SDP for High quality Opus audio - Stack Overflow, 访问时间为 十二月 13, 2025, https://stackoverflow.com/questions/33649283/how-to-set-up-sdp-for-high-quality-opus-audio
- CUCM / CUBE / Unity Cxn - fun with G729 variants - Cisco Community, 访问时间为 十二月 13, 2025, https://community.cisco.com/t5/ip-telephony-and-phones/cucm-cube-unity-cxn-fun-with-g729-variants/td-p/3986519
- RFC 7261 - Offer/Answer Considerations for G723 Annex A and G729 Annex B - IETF Datatracker, 访问时间为 十二月 13, 2025, https://datatracker.ietf.org/doc/rfc7261/
- Opus Decoder, 访问时间为 十二月 13, 2025, https://www.opus-codec.org/docs/html_api/group__opusdecoder.html
- Opus Decoder, 访问时间为 十二月 13, 2025, https://opus-codec.org/docs/html_api-1.0.1/group__opus__decoder.html
- Opus Decoder, 访问时间为 十二月 13, 2025, https://www.opus-codec.org/docs/opus_api-1.2/group__opus__decoder.html
- What exactly is the difference between 16bit, 24bit, and 32bit float WAV if they’re all lossless audio file formats? Are there differences in terms of quality? - Reddit, 访问时间为 十二月 13, 2025, https://www.reddit.com/r/audioengineering/comments/1c68k2/what_exactly_is_the_difference_between_16bit/
- Opus Decoder, 访问时间为 十二月 13, 2025, https://opus-codec.org/docs/opus_api-1.5/group__opus__decoder.html
- What is the basic structure of an RTP message? - Tencent Cloud, 访问时间为 十二月 13, 2025, https://www.tencentcloud.com/techpedia/102515
- Introducing RTP: The Packet Format - Webex Blog, 访问时间为 十二月 13, 2025, https://blog.webex.com/engineering/introducing-rtp-the-packet-format/
- RTP payload formats - Wikipedia, 访问时间为 十二月 13, 2025, https://en.wikipedia.org/wiki/RTP_payload_formats
- Wrong RTP timestamps when Opus is used in mono mode · Issue #753 - GitHub, 访问时间为 十二月 13, 2025, https://github.com/alfredh/baresip/issues/753
- Calculate time with Opus codec - Wireshark Q&A, 访问时间为 十二月 13, 2025, https://osqa-ask.wireshark.org/questions/53247/calculate-time-with-opus-codec/
- G.729 - Wikipedia, 访问时间为 十二月 13, 2025, https://en.wikipedia.org/wiki/G.729
$$