一、opus函数调用接口
二、自适应网络调整参数介绍
1、WebRtcOpus_SetBitRate
Opus支持码率从6 kbit/s到510 kbit/s的切换功能,以适应这种网络状态。以20ms单帧数据编码为例,下面是各种配置的Opus的比特率最佳点。
2、WebRtcOpus_SetPacketLossRate
动态配置丢包率,是为了动态调整opus FEC的冗余度。opus编码器自带inband FEC冗余算法,增强抗丢包能力。大概使用的是非对称冗余协议。将一些关键信息多次编码重传。
3、WebRtcOpus_EnableFec/DisableFec
开启或者关闭inband FEC功能。
走读opus代码,发现只有silk编码支持inband FEC。函数实现调用栈如下:
opus_encode_native
->silk_Encode
->silk_encode_frame_Fxx
->silk_encode_frame_FLP
->silk_LBRR_encode_FLP
celt不支持inband FEC。猜测celt是通过改变参考帧长度,来增强抗网络丢包能力。
4、WebRtcOpus_EnableDtx/DisableDtx
DTX:Discontinuous Transmission。不同于music场景,在voip场景下,声音不是持续的,会有一段一段的间歇期。这个间歇期若是也正常编码音频数据,对带宽有些浪费。所以opus支持DTX功能,若是检测当前会议没有明显通话声音,仅定期发送(400ms)静音指示报文给对方。对方收到静音指示报文可以补舒适噪音包(opus不支持CNG,不能补舒适噪音包)或者静音包给音频渲染器。
5、WebRtcOpus_EnableCbr/DisableCbr
opus支持恒定码率和变码率两种编码方式。一般流媒体使用CBR,voip场景使用VBR。
6、WebRtcOpus_SetMaxPlaybackRate
根据采样率调整算法bandwidth参数。
7、WebRtcOpus_SetComplexity
取值范围0-10。值越大代码复杂度越高,音质越好。webrtc里面只有安卓、IOS、ARM支持复杂度切换功能。windows系统默认都是9。
8、WebRtcOpus_SetForceChannels
opus支持单双声道切换功能。当传入数据是双声道,解码器是单声道,解码器会average左右声道数据,以单声道数据输出。
当传入数据是单声道,解码器是双声道,解码器会给左右声道输出同一份数据。一般voip使用单声道传输,music使用双声道,这种单双声道切换,主要提升music场景下抗弱网能力。
9、WebRtcOpus_EncoderCreate.application
#define OPUS_APPLICATION_VOIP 2048
#define OPUS_APPLICATION_AUDIO 2049
#define OPUS_APPLICATION_RESTRICTED_LOWDELAY 2051
application有三种模式:voip、music、lowdelay三种模式。
voip主要使用SILK编码,music主要使用CELT编码。lowdelay取消voip场景的一些优化方案,换取一丢丢低延时。
三、参考
《rfc6716》