新版本的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方法