WebRTC中默認是采用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)
- 浮點和定點實現
WebRTC中要使用Opus編碼,首先在SDP中要有以下定義:
a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10;useinbandfec=1
以上的WebRTC產生的默認配置,這種配置下,音頻采樣率是48000,音頻打包時間是10ms,單聲道,編碼采用的是Opus里面的silk編碼,適合傳人聲,不適合傳音樂。下面我們分別就如何修改采樣率,如何修改聲道數,如何修改碼流做詳細介紹。
修改采樣率
Opus支持8000,12000,16000,24000,48000 這幾種采樣率,比如我們現在如果要設置音頻采樣率為8000,我們應該如何做呢?把SDP修改成如下格式就可以支持8000采樣率:
a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc 前面兩行基本上不會動 a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=8000;
不管我們現在采樣率要設置為多少,sdp中的前面兩行基本上是不會動的。根據抓包分析發現,即使我們現在把采樣率修改為8000,音頻Rtp中的時間戳還是以960遞增。960是在48000采樣率情況下20ms聲音的信號數。
WebRTC中還支持通信雙方以非對稱采樣率工作。比如A和B通話,A的采樣率為48000,B的采樣率為8000。當雙方采樣率不一樣時,WebRTC應該如何處理呢?舉個例子:
A-----------------> B OfferSDP
a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=16000
B------------------->A AnswerSDP
a=rtpmap:111 opus/48000/2 a=rtcp-fb:111 transport-cc a=fmtp:111 minptime=10;useinbandfec=1;maxplaybackrate=48000
A用戶的采樣率為B用戶返回的AnswerSDP中的maxplaybackrate,這里是48000,所以A用戶音頻采樣為48000,
同理B用戶的采樣率為16000
聲道數
在a=ftmp這一行中加入stereo=1代表雙聲道,stereo=0代表單聲道,雙聲道一般用來傳音樂,從WebRTC代碼中可以發現,當我們設置聲道數為2時,opus編碼內部將使用celt,代碼如下:
config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip : AudioEncoderOpus::kAudio;
kVoip適合於語音通話,kAudio適合於傳輸音樂。
碼流
在a=ftmp這一行中加入maxaveragebitrate代表接收方能接受的最大碼流,單位為bit。比如maxaveragebitrate=64000代表碼流為64kbps
開啟DTX
DTX 是 Discontinuous Transmission的簡稱,這個特性是在用戶不說話時不傳輸語音,這樣可以節省點帶寬。默認WebRTC是不開啟這個特性的,要開啟DTX,只需要在a=ftmp這一行中加入usedtx=1就行
轉自: https://www.jianshu.com/p/090cbdf98a96