新版本的WebRTC默认是采用OPUS编码,OPUS编码是silk编码和celt编码的合成,silk编码是skype公司开源的一个编码,
特别适合语音通信,它根据人的声音做了很多优化,但不是适合传输高质量的音乐。celt编码相反更适合传输高质量的音乐。
OPUS编码在采样率很高的情况下,音质还是非常不错的,以下这个连接地址有很多opus的音频样例,大家可以在线听听。
http://www.opus-codec.org/examples/
根据阅读官方文档知道OPUS编码支持8000,16000,32000,48000等几种编码,支持单声道,双声道,支持6kb-510kb编码率。如果我们想改变WebRTC的声音
编码参数,我们应该如何做呢?
1.首先我会先去看看WebRTC有没有引出相关的接口,结果查看了PeerConnection,MediaStream,AudioTrack等等相关的类后,根本没有发现相关接口。
2.根据以往经验,如果WebRTC没有提供直接的接口来调,往往还可以通过修改SDP参数和达到我们的目的。我把生成的Offer
SDP打印出来后,发现了比较可疑的地
方,"fmtp:111
minptime=10;useinbandfec=1",这一行是设置opus编码参数的地方。我再以“useinbandfec”为关键字在WebRTC中代码中搜索,
在mediaconstants.cc代码,找到以下相关代码
// draft-spittka-payload-rtp-opus-03.txt
const char kCodecParamPTime[] = "ptime";
const char kCodecParamMaxPTime[] = "maxptime";
const char kCodecParamMinPTime[] = "minptime";
const char kCodecParamSPropStereo[] = "sprop-stereo";
const char kCodecParamStereo[] = "stereo";
const char kCodecParamUseInbandFec[] = "useinbandfec";
const char kCodecParamUseDtx[] = "usedtx";
const char kCodecParamMaxAverageBitrate[] = "maxaveragebitrate";
const char kCodecParamMaxPlaybackRate[] = "maxplaybackrate";
3.我依葫芦画瓢,在我自己写的demo代码中把sdp中的"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=8000",编译成功运行后,发现参数生效了,发送一路语音占用的带宽由于5K变成了3K左右,这就证明参数生效了。
4.在网络挺别差的情况下,我们可能希望声音的码流再变小一点,对音质的要求反而不是哪么高了,音频采样率为8000HZ就够了。要实现这个功能的话把"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=6000;maxplaybackrate=8000"就行了
5.如果要传音乐,哪我们必需强制OPUS切换到CELT编码。要实现这个功能的话把"fmtp:111
minptime=10;useinbandfec=1" 这一行替换成"fmtp:111
minptime=10;useinbandfec=1;maxaveragebitrate
=64000;maxplaybackrate=48000;stereo=1"就行了
以下功能在WebRTC56版本中试验成功,修改SDP的时机在 SetRemoteDescription
之前,把对方传过来的SDP字符串给替换了,再调用SetRemoteDescription方法