源碼位置
[Code:webrtc\src\api\audio_codecs\]
[Code:modules\audio_coding\codecs\]
WebRTC默認是采用OPUS編碼。
Opus
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編碼,適合傳人聲,不適合傳音樂。
[Code:modules\audio_coding\codecs\opus\]
PCM16
PCM 脈沖編碼調制是Pulse Code Modulation的縮寫。脈沖編碼調制是數字通信的編碼方式之一。主要過程是將話音、圖像等模擬信號每隔一定時間進行取樣,使其離散化,同時將抽樣值按分層單位四舍五入取整量化,同時將抽樣值按一組二進制碼來表示抽樣脈沖的幅值。
模擬信號數字化必須經過三個過程,即抽樣、量化和編碼。
采樣頻率
人對頻率的識別范圍是 20HZ ## 20000HZ, 如果每秒鍾能對聲音做 20000 個采樣, 回放時就足可以滿足人耳的需求.
* 8000hz 為電話采樣。
* 22050 的采樣頻率是常用的。
* 44100已是CD音質, 超過48000的采樣對人耳已經沒有意義。
* 一般情況下,一幀PCM是由2048次采樣組成的。
采樣位數
每個采樣數據記錄的是振幅, 采樣精度取決於儲存空間(采樣位數)的大小:
* 1 字節(也就是8bit) 只能記錄 256 個數, 也就是只能將振幅划分成 256 個等級
* 2 字節(也就是16bit) 可以細到 65536 個數, 這已是 CD 標准了;
* 如果是雙聲道(stereo), 采樣就是雙份的, 文件也差不多要大一倍.
比特率
碼率是指經過編碼后的音頻數據每秒鍾需要用多少個比特來表示
無損音頻
一般都是指傳統CD格式中的16bit/44.1kHz采樣率的文件格式
//采樣位數:高低8位,拼接成16bit。
size_t WebRtcPcm16b_Decode() {
for (i = 0; i < len / 2; ++i)
speech[i] = encoded[2 * i] << 8 | encoded[2 * i + 1];
}
//采樣頻率:支持8K, 16k, 32k, 48k
AudioDecoderPcm16B::AudioDecoderPcm16B(int sample_rate_hz, size_t num_channels)
: sample_rate_hz_(sample_rate_hz), num_channels_(num_channels) {
RTC_DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
sample_rate_hz == 32000 || sample_rate_hz == 48000)
<< "Unsupported sample rate " << sample_rate_hz;
RTC_DCHECK_GE(num_channels, 1);
}
[Code:modules\audio_coding\codecs\pcm16b\]
ISAC(Internet Speech Audio Codec)
是一種寬帶和超寬帶音頻編碼器。
[Code:modules\audio_coding\codecs\isac]
LIBC(Internet Low Bitrate Codec)
一種窄帶語音編解碼器,可以保證低帶寬條件下較好的音質,采樣頻率:8khz;20ms每幀時比特率為15.2kbps;30ms每幀時比特率為13.33kbps
[Code:modules\audio_coding\codecs\ilbc\]
G.711
一種由國際電信聯盟(ITU-T)制定的音頻編碼方式,又稱為ITU-T G.711。它代表了對數PCM(logarithmic pulse-code modulation)抽樣標准,主要用於電話。它主要用脈沖編碼調制對音頻采樣,采樣率為8k每秒。它利用一個 64Kbps 未壓縮通道傳輸語音訊號。 起壓縮率為1:2, 即把16位數據壓縮成8位。G.711是主流的波形聲音編解碼器。20ms打包,帶寬為 ( 528/20 + 64) Kbit/s=90.4 Kbit/s
G.711是最基本的一種編碼方法,俗稱PCM,采用μ-law(主要北美地區使用)和A-law(其它地區)兩種非線性量化方法進行壓縮。說它“基本”是因為一方面PCM算法非常簡單,很多ADC硬件的輸入輸出就直接支持PCM格式;另一方面PCM格式在通信系統中往往需要進一步壓縮,因此它是其它語音編碼算法的輸入源。
[Code:modules\audio_coding\codecs\g711\]
G.722
G.722.1是由Polycom提出的一套低碼率低復雜度的寬帶語音編碼算法,主要采用了變換域編碼方法,因此可以對語音(300~4000Hz)和7kHz以內的音樂進行編碼,采樣率為16kHz,其32kbps碼率的重建語音質量相當於64 kbps G.722 SB-ADPCM。在實際的應用中,本算法在低碼率時其音質要高於MP3等音頻算法,再加上算法低復雜度非常適合嵌入式平台通信、存儲應用。最后,它的附錄C中提供了32kHz采樣的14k帶寬的音頻編碼方案,進一步提高了音質。
[Code:modules\audio_coding\codecs\g722\]
Red (redundant audio coding)
gather the two latest encodings from the underlying codec into one packet
一個包內包含兩種編碼后的數據。
[Code:modules\audio_coding\codecs\red\]
*官方解釋:RED (REDundant coding) * The primary motivation of sending redundant data is to be able to recover packets lost under lossy network conditions. If a packet is lost then the missing information may be reconstructed at the receiver from the redundant data that arrives in the following packet(s).
// secondary data.
AudioEncoder::EncodedInfo AudioEncoderCopyRed::EncodeImpl(){
if (secondary_info_.encoded_bytes > 0) {
encoded->AppendData(secondary_encoded_);
info.redundant.push_back(secondary_info_);
RTC_DCHECK_EQ(info.redundant.size(), 2);
}
}
CNG即comfort noise generator,舒適噪音生成
- 舒適噪音生成(comfort noise generator,CNG)是一個在通話過程中出現短暫靜音時用來為電話通信產生背景噪聲的程序。
- 舒適噪音生成是VoIP技術中靜音抑制(silence suppression)或語音活動檢測(VAD)的一部分。語音活動檢測及舒適噪音生成是用來維持一個感受到的可接受的服務品質,同時盡可能降低傳輸成本和帶寬使用。
- 結合語音活動檢測算法的舒適噪音生成可快速確定靜音出現的時間,並在出現靜音時產生人工噪音,直到語音活動重新恢復為止。產生的人工噪音可形成傳輸流不間斷的假象,因此電話中的背景聲音會從始至終保持連續,接聽者不會有電話掉線的感覺。50%左右的通話中其實是沒有講話的。語音活動檢測軟件可以讓一個攜帶語音擁塞的數據網通過因特網監測靜音,通過阻止“靜音封包”的傳送來節省帶寬。
- 舒適噪音生成運用特殊算法制造能夠與真實背景噪音相匹配的人工噪音。如果在靜音期內聲音傳輸完全中斷,背景噪音的產生則有助於避免可能出現的噪音調制。需要抑制噪音調制的理由眾多:一方面,噪音調制與自然背景噪音區別明顯,通話方會覺得這種聲音很不舒服;另一方面,當通訊恢復時,噪音調制會減少語言清晰度。
- 據估算,運用語音活動檢測及舒適噪音生成可將一組音頻信道對帶寬的需求降低50%。