通过RTP 将语音数据发给对方之前需要将语音数据进行编码,whatsapp 采用opus编码。Opus编码是由silk编码和celt编码合并在一起,silk编码是由skype公司开源的一种语音编码,特别适合人声,适合于Voip语音通信。celt和mp3,aac类似,适合于传输音乐。Opus编码具备以下特点:
- 6 kb /秒到510 kb / s的比特率
- 采样率从8 kHz(窄带)到48 kHz(全频)
- 帧大小从2.5毫秒到60毫秒
- 支持恒定比特率(CBR)和可变比特率(VBR)
- 从窄带到全频段的音频带宽
- 支持语音和音乐
- 支持单声道和立体声
- 支持多达255个频道(多数据流的帧)
- 可动态调节比特率,音频带宽和帧大小
- 良好的鲁棒性丢失率和数据包丢失隐藏(PLC)
-浮点和定点实现
在发起语音通话的XMPP协商中,会有明确的opus编码标识
<call to='xx@s.whatsapp.net' id='xxx'><offer call-creator='xxx:0@s.whatsapp.net' call-id='xxx' device_class='2015'><privacy>xxx</privacy><audio rate='8000' enc='opus'/><audio rate='16000' enc='opus'/><net medium='3'/><capability ver='1'>AQT3CcT6</capability><enc v='2' type='msg'>xxxx</enc><encopt keygen='2'/></offer>
</call>
<call from='xxx@s.whatsapp.net' version='2.24.2.75' platform='iphone' id='xx-81' t='xxx'><accept call-id='xxx' call-creator='xxx@s.whatsapp.net'><audio rate='16000' enc='opus'/><net medium='1'/><encopt keygen='2'/></accept>
</call>