WebRTC系列之音频的那些事
年初因?yàn)楣ぷ餍枰?#xff0c;開(kāi)始學(xué)習(xí)WebRTC,就被其復(fù)雜的編譯環(huán)境和巨大的代碼量所折服,注定是一塊難啃的骨頭。俗話說(shuō)萬(wàn)事開(kāi)頭難,堅(jiān)持一個(gè)恒心,終究能學(xué)習(xí)到WebRTC的設(shè)計(jì)精髓。今天和大家聊聊WebRTC中音頻的那些事。WebRTC由語(yǔ)音引擎,視頻引擎和網(wǎng)絡(luò)傳輸三大模塊組成,其中語(yǔ)音引擎是WebRTC中最具價(jià)值的技術(shù)之一,實(shí)現(xiàn)了音頻數(shù)據(jù)的采集、前處理、編碼、發(fā)送、接受、解碼、混音、后處理、播放等一系列處理流程。
音頻引擎主要包含:音頻設(shè)備模塊ADM、音頻編碼器工廠、音頻解碼器工廠、混音器Mixer、音頻前處理APM。
?
音頻工作機(jī)制
?
想要系統(tǒng)的了解音頻引擎,首先需要了解核心的實(shí)現(xiàn)類(lèi)和音頻數(shù)據(jù)流向,接下來(lái)我們將簡(jiǎn)單的分析一下。
音頻引擎核心類(lèi)圖:
?
音頻引擎WebrtcVoiceEngine主要包含音頻設(shè)備模塊AudioDeviceModule、音頻混音器AudioMixer、音頻3A處理器AudioProcessing、音頻管理類(lèi)AudioState、音頻編碼器工廠AudioEncodeFactory、音頻解碼器工廠AudioDecodeFactory、語(yǔ)音媒體通道包含發(fā)送和接受等。
1.音頻設(shè)備模塊AudioDeviceModule主要負(fù)責(zé)硬件設(shè)備層,包括音頻數(shù)據(jù)的采集和播放,以及硬件設(shè)備的相關(guān)操作。
2.音頻混音器AudioMixer主要負(fù)責(zé)音頻發(fā)送數(shù)據(jù)的混音(設(shè)備采集和伴音的混音)、音頻播放數(shù)據(jù)的混音(多路接受音頻和伴音的混音)。
3.音頻3A處理器AudioProcessing主要負(fù)責(zé)音頻采集數(shù)據(jù)的前處理,包含回聲消除AEC、自動(dòng)增益控制AGC、噪聲抑制NS。APM分為兩個(gè)流,一個(gè)近端流,一個(gè)遠(yuǎn)端流。近端(Near-end)流是指從麥克風(fēng)進(jìn)入的數(shù)據(jù);遠(yuǎn)端(Far-end)流是指接收到的數(shù)據(jù)。
4.音頻管理類(lèi)AudioState包含音頻設(shè)備模塊ADM、音頻前處理模塊APM、音頻混音器Mixer以及數(shù)據(jù)流轉(zhuǎn)中心AudioTransportImpl。
5.音頻編碼器工廠AudioEncodeFactory包含了Opus、iSAC、G711、G722、iLBC、L16等codec。
6.音頻解碼器工廠AudioDecodeFactory包含了Opus、iSAC、G711、G722、iLBC、L16等codec。
?
音頻的工作流程圖:
1.發(fā)起端通過(guò)麥克風(fēng)進(jìn)行聲音采集
2.發(fā)起端將采集到的聲音信號(hào)輸送給APM模塊,進(jìn)行回聲消除AEC,噪音抑制NS,自動(dòng)增益控制處理AGC
3.發(fā)起端將處理之后的數(shù)據(jù)輸送給編碼器進(jìn)行語(yǔ)音壓縮編碼
4.發(fā)起端將編碼后的數(shù)據(jù)通過(guò)RtpRtcp傳輸模塊發(fā)送,通過(guò)Internet網(wǎng)路傳輸?shù)浇邮斩?/span>
5.接收端接受網(wǎng)絡(luò)傳輸過(guò)來(lái)的音頻數(shù)據(jù),先輸送給NetEQ模塊進(jìn)行抖動(dòng)消除,丟包隱藏解碼等操作
6.接收端將處理過(guò)后的音頻數(shù)據(jù)送入聲卡設(shè)備進(jìn)行播放
?
NetEQ模塊是Webrtc語(yǔ)音引擎中的核心模塊
在 NetEQ 模塊中,又被大致分為 MCU模塊和 DSP 模塊。MCU 主要負(fù)責(zé)做延時(shí)及抖動(dòng)的計(jì)算統(tǒng)計(jì),并生成對(duì)應(yīng)的控制命令。而 DSP 模塊負(fù)責(zé)接收并根據(jù) MCU 的控制命令進(jìn)行對(duì)應(yīng)的數(shù)據(jù)包處理,并傳輸給下一個(gè)環(huán)節(jié)。
?
?
音頻數(shù)據(jù)流向
根據(jù)上面介紹的音頻工作流程圖,我們將繼續(xù)細(xì)化一下音頻的數(shù)據(jù)流向。將會(huì)重點(diǎn)介紹一下數(shù)據(jù)流轉(zhuǎn)中心AudioTransportImpl在整個(gè)環(huán)節(jié)中扮演的重要角色。
數(shù)據(jù)流轉(zhuǎn)中心AudioTransportImpl實(shí)現(xiàn)了采集數(shù)據(jù)處理接口RecordDataIsAvailbale和播放數(shù)據(jù)處理接口NeedMorePlayData。RecordDataIsAvailbale負(fù)責(zé)采集音頻數(shù)據(jù)的處理和將其分發(fā)到所有的發(fā)送Streams。NeedMorePlayData負(fù)責(zé)混音所有接收到的Streams,然后輸送給APM作為一路參考信號(hào)處理,最后將其重采樣到請(qǐng)求輸出的采樣率。
?
RecordDataIsAvailbale內(nèi)部主要流程:
?
NeedMorePlayData內(nèi)部主要流程:
?? 1.1 計(jì)算輸出采樣率CalculateOutputFrequency()
?? 1.2 從Source收集音頻數(shù)據(jù)GetAudioFromSources(),選取沒(méi)有mute,且能量最大的三路進(jìn)行混音
?? 1.3 執(zhí)行混音操作FrameCombiner::Combine()
由上圖的數(shù)據(jù)流向發(fā)現(xiàn),為什么需要FineAudioBuffer和AudioDeviceBuffer?因?yàn)閃ebRTC 的音頻流水線只支持處理 10 ms 的數(shù)據(jù),不同的操作系統(tǒng)平臺(tái)提供了不同的采集和播放時(shí)長(zhǎng)的音頻數(shù)據(jù),不同的采樣率也會(huì)提供不同時(shí)長(zhǎng)的數(shù)據(jù)。例如iOS上,16K采樣率會(huì)提供8ms的音頻數(shù)據(jù)128幀;8K采樣率會(huì)提供16ms的音頻數(shù)據(jù)128幀;48K采樣率會(huì)提供10.67ms的音頻數(shù)據(jù)512幀。
AudioDeviceModule 播放和采集的數(shù)據(jù),總會(huì)通過(guò) AudioDeviceBuffer 拿進(jìn)來(lái)或者送出去 10 ms 的音頻數(shù)據(jù)。對(duì)于不支持采集和播放 10 ms 音頻數(shù)據(jù)的平臺(tái),在平臺(tái)的 AudioDeviceModule 和 AudioDeviceBuffer 還會(huì)插入一個(gè) FineAudioBuffer,用于將平臺(tái)的音頻數(shù)據(jù)格式轉(zhuǎn)換為 10 ms 的 WebRTC 能處理的音頻幀。在AudioDeviceBuffer 中,還會(huì)10s定時(shí)統(tǒng)計(jì)一下當(dāng)前硬件設(shè)備過(guò)來(lái)的音頻數(shù)據(jù)對(duì)應(yīng)的采樣點(diǎn)個(gè)數(shù)和采樣率,可以用于檢測(cè)當(dāng)前硬件的一個(gè)工作狀態(tài)。
?
音頻相關(guān)改動(dòng)
1.音頻Profile的實(shí)現(xiàn),支持Voip和Music 2種場(chǎng)景,實(shí)現(xiàn)了采樣率、編碼碼率、編碼模式、聲道數(shù)的綜合性技術(shù)策略。
iOS實(shí)現(xiàn)了采集和播放線程的分離,支持雙聲道的播放。
2. 音頻3A參數(shù)的兼容性下發(fā)適配方案。
3.耳機(jī)場(chǎng)景的適配,藍(lán)牙耳機(jī)和普通耳機(jī)的適配,動(dòng)態(tài)3A切換適配。
4.Noise_Injection噪聲注入算法,作為一路參考信號(hào),在耳機(jī)場(chǎng)景的回聲消除中的作用特別明顯。
5.支持本地伴音文件file和網(wǎng)絡(luò)伴音文件http&https。
6.Audio Nack的實(shí)現(xiàn),提高音頻的抗丟包能力,目前正在進(jìn)行In-band FEC。
7.音頻處理在單講和雙講方面的優(yōu)化。
8.iOS在Built-In AGC方面的研究:
?
音頻問(wèn)題排查
和大家分享一下音頻最常見(jiàn)的一些現(xiàn)象以及原因:
更多技術(shù)干貨,歡迎關(guān)注vx公眾號(hào)“網(wǎng)易智慧企業(yè)技術(shù)+”。系列課程提前看,精品禮物免費(fèi)得,還可直接對(duì)話CTO。
聽(tīng)網(wǎng)易CTO講述前沿觀察,看最有價(jià)值技術(shù)干貨,學(xué)網(wǎng)易最新實(shí)踐經(jīng)驗(yàn)。網(wǎng)易智慧企業(yè)技術(shù)+,陪你從思考者成長(zhǎng)為技術(shù)專(zhuān)家。
總結(jié)
以上是生活随笔為你收集整理的WebRTC系列之音频的那些事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker文件系统实战
- 下一篇: 知识库成长记