• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>
    您當前的位置是:  首頁(yè) > 資訊 > 文章精選 >
     首頁(yè) > 資訊 > 文章精選 >

    WebRTC系列之音頻的那些事

    2020-06-23 10:59:24   作者:網(wǎng)易云信資深客戶(hù)端開(kāi)發(fā)工程師   來(lái)源:網(wǎng)易云信   評論:0  點(diǎn)擊:



      年初因為工作需要,開(kāi)始學(xué)習WebRTC,被其復雜的編譯環(huán)境和巨大的代碼量所折服,注定是一塊難啃的骨頭。俗話(huà)說(shuō)萬(wàn)事開(kāi)頭難,堅持一個(gè)恒心,終究能學(xué)習到WebRTC的設計精髓。
      今天和大家聊聊WebRTC中音頻的那些事。WebRTC由語(yǔ)音引擎,視頻引擎和網(wǎng)絡(luò )傳輸三大模塊組成,其中語(yǔ)音引擎是WebRTC中最具價(jià)值的技術(shù)之一,實(shí)現了音頻數據的采集、前處理、編碼、發(fā)送、接受、解碼、混音、后處理、播放等一系列處理流程。
      音頻引擎主要包含:音頻設備模塊ADM、音頻編碼器工廠(chǎng)、音頻解碼器工廠(chǎng)、混音器Mixer、音頻前處理APM。
      音頻工作機制
      想要系統的了解音頻引擎,首先需要了解核心的實(shí)現類(lèi)和音頻數據流向,接下來(lái)我們將簡(jiǎn)單的分析一下。
      音頻引擎核心類(lèi)圖

      音頻引擎WebrtcVoiceEngine主要包含音頻設備模塊AudioDeviceModule、音頻混音器AudioMixer、音頻3A處理器AudioProcessing、音頻管理類(lèi)AudioState、音頻編碼器工廠(chǎng)AudioEncodeFactory、音頻解碼器工廠(chǎng)AudioDecodeFactory、語(yǔ)音媒體通道包含發(fā)送和接受等。
    1. 音頻設備模塊AudioDeviceModule主要負責硬件設備層,包括音頻數據的采集和播放,以及硬件設備的相關(guān)操作。
    2. 音頻混音器AudioMixer主要負責音頻發(fā)送數據的混音(設備采集和伴音的混音)、音頻播放數據的混音(多路接受音頻和伴音的混音)。
    3. 音頻3A處理器AudioProcessing主要負責音頻采集數據的前處理,包含回聲消除AEC、自動(dòng)增益控制AGC、噪聲抑制NS。APM分為兩個(gè)流,一個(gè)近端流,一個(gè)遠端流。近端(Near-end)流是指從麥克風(fēng)進(jìn)入的數據;遠端(Far-end)流是指接收到的數據。
    4. 音頻管理類(lèi)AudioState包含音頻設備模塊ADM、音頻前處理模塊APM、音頻混音器Mixer以及數據流轉中心AudioTransportImpl。
    5. 音頻編碼器工廠(chǎng)AudioEncodeFactory包含了Opus、iSAC、G711、G722、iLBC、L16等codec。
    6. 音頻解碼器工廠(chǎng)AudioDecodeFactory包含了Opus、iSAC、G711、G722、iLBC、L16等codec。
      音頻的工作流程圖
    1. 發(fā)起端通過(guò)麥克風(fēng)進(jìn)行聲音采集
    2. 發(fā)起端將采集到的聲音信號輸送給APM模塊,進(jìn)行回聲消除AEC,噪音抑制NS,自動(dòng)增益控制處理AGC
    3. 發(fā)起端將處理之后的數據輸送給編碼器進(jìn)行語(yǔ)音壓縮編碼
    4. 發(fā)起端將編碼后的數據通過(guò)RtpRtcp傳輸模塊發(fā)送,通過(guò)Internet網(wǎng)路傳輸到接收端
    5. 接收端接受網(wǎng)絡(luò )傳輸過(guò)來(lái)的音頻數據,先輸送給NetEQ模塊進(jìn)行抖動(dòng)消除,丟包隱藏解碼等操作
    6. 接收端將處理過(guò)后的音頻數據送入聲卡設備進(jìn)行播放
      NetEQ模塊是Webrtc語(yǔ)音引擎中的核心模塊
      在 NetEQ 模塊中,又被大致分為 MCU模塊和 DSP 模塊。
      MCU 主要負責做延時(shí)及抖動(dòng)的計算統計,并生成對應的控制命令。
      而 DSP 模塊負責接收并根據 MCU 的控制命令進(jìn)行對應的數據包處理,并傳輸給下一個(gè)環(huán)節。
      音頻數據流向
      根據上面介紹的音頻工作流程圖,我們將繼續細化一下音頻的數據流向。將會(huì )重點(diǎn)介紹一下數據流轉中心AudioTransportImpl在整個(gè)環(huán)節中扮演的重要角色。
      數據流轉中心AudioTransportImpl實(shí)現了采集數據處理接口RecordDataIsAvailbale和播放數據處理接口NeedMorePlayData。
      RecordDataIsAvailbale負責采集音頻數據的處理和將其分發(fā)到所有的發(fā)送Streams。
      NeedMorePlayData負責混音所有接收到的Streams,然后輸送給APM作為一路參考信號處理,最后將其重采樣到請求輸出的采樣率。
      RecordDataIsAvailbale內部主要流程:
    1. 由硬件采集過(guò)來(lái)的音頻數據,直接重采樣到發(fā)送采樣率
    2. 由音頻前處理針對重采樣之后的音頻數據進(jìn)行3A處理
    3. VAD處理
    4. 數字增益調整采集音量
    5. 音頻數據回調外部進(jìn)行外部前處理
    6. 混音發(fā)送端所有需要發(fā)送的音頻數據,包括采集的數據和伴音的數據
    7. 計算音頻數據的能量值
    8. 將其分發(fā)到所有的發(fā)送Streams
      NeedMorePlayData內部主要流程:
      1.混音所有接收到的Streams的音頻數據
      1.1 計算輸出采樣率CalculateOutputFrequency()
      1.2 從Source收集音頻數據GetAudioFromSources(),選取沒(méi)有mute,且能量最大的三路進(jìn)行混音
      1.3 執行混音操作FrameCombiner::Combine()
      2.特定條件下,進(jìn)行噪聲注入,用于采集側作為參考信號
      3.對本地伴音進(jìn)行混音操作
      4.數字增益調整播放音量
      5.音頻數據回調外部進(jìn)行外部前處理
      6.計算音頻數據的能量值
      7.將音頻重采樣到請求輸出的采樣率
      8.將音頻數據輸送給APM作為一路參考信號處理
      由上圖的數據流向發(fā)現,為什么需要FineAudioBuffer和AudioDeviceBuffer?
      因為WebRTC 的音頻流水線(xiàn)只支持處理 10 ms 的數據,不同的操作系統平臺提供了不同的采集和播放時(shí)長(cháng)的音頻數據,不同的采樣率也會(huì )提供不同時(shí)長(cháng)的數據。
      例如iOS上,16K采樣率會(huì )提供8ms的音頻數據128幀;8K采樣率會(huì )提供16ms的音頻數據128幀;48K采樣率會(huì )提供10.67ms的音頻數據512幀。
      AudioDeviceModule 播放和采集的數據,總會(huì )通過(guò) AudioDeviceBuffer 拿進(jìn)來(lái)或者送出去 10 ms 的音頻數據。
      對于不支持采集和播放 10 ms 音頻數據的平臺,在平臺的 AudioDeviceModule 和 AudioDeviceBuffer 還會(huì )插入一個(gè) FineAudioBuffer,用于將平臺的音頻數據格式轉換為 10 ms 的 WebRTC 能處理的音頻幀。
      在A(yíng)udioDeviceBuffer 中,還會(huì )10s定時(shí)統計一下當前硬件設備過(guò)來(lái)的音頻數據對應的采樣點(diǎn)個(gè)數和采樣率,可以用于檢測當前硬件的一個(gè)工作狀態(tài)。
      音頻相關(guān)改動(dòng)
    1. 音頻Profile的實(shí)現,支持Voip和Music 2種場(chǎng)景,實(shí)現了采樣率、編碼碼率、編碼模式、聲道數的綜合性技術(shù)策略。iOS實(shí)現了采集和播放線(xiàn)程的分離,支持雙聲道的播放。
    2. 音頻3A參數的兼容性下發(fā)適配方案。
    3. 耳機場(chǎng)景的適配,藍牙耳機和普通耳機的適配,動(dòng)態(tài)3A切換適配。
    4. Noise_Injection噪聲注入算法,作為一路參考信號,在耳機場(chǎng)景的回聲消除中的作用特別明顯。
    5. 支持本地伴音文件file和網(wǎng)絡(luò )伴音文件http&https。
    6. Audio Nack的實(shí)現,提高音頻的抗丟包能力,目前正在進(jìn)行In-band FEC。
    7. 音頻處理在單講和雙講方面的優(yōu)化。
    8. iOS在Built-In AGC方面的研究:
      (1)Built-In AGC對于Speech和Music有效,對于noise和環(huán)境底噪不會(huì )產(chǎn)生作用。
      (2)不同機型的麥克風(fēng)硬件的增益不同,iPhone 7 Plus > iPhone 8 > iPhone X;因此會(huì )在軟件AGC和硬件AGC都關(guān)閉的情況下,遠端聽(tīng)到的聲音大小表現不一樣。
      (3)iOS除了提供的可開(kāi)關(guān)的AGC以外,還有一個(gè)AGC會(huì )一直工作,對信號的level進(jìn)行微調;猜想這個(gè)一直工作的AGC是iOS自帶的analog AGC,可能和硬件有關(guān),且沒(méi)有API可以開(kāi)關(guān),而可開(kāi)關(guān)的AGC是一個(gè)digital AGC。
      (4)在大部分iOS機型上,外放模式“耳機再次插入后”,input的音量會(huì )變小。當前的解決方案是在耳機再次插入后,增加一個(gè)preGain來(lái)把輸入的音量拉回正常值。
      音頻問(wèn)題排查
      和大家分享一下音頻最常見(jiàn)的一些現象以及原因:
      以上就是我關(guān)于語(yǔ)音引擎的一些分享,歡迎大家留言與我探討。
     
    【免責聲明】本文僅代表作者本人觀(guān)點(diǎn),與CTI論壇無(wú)關(guān)。CTI論壇對文中陳述、觀(guān)點(diǎn)判斷保持中立,不對所包含內容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔全部責任。

    相關(guān)熱詞搜索: WebRTC

    上一篇:遷移實(shí)戰|從VMware和Hyper-V遷移到OpenStack

    下一篇:最后一頁(yè)

    專(zhuān)題

    CTI論壇會(huì )員企業(yè)

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 福安市| 庄河市| 拜城县| 乌审旗| 湘潭市| 阳谷县| 德兴市| 东源县| 嘉兴市| 英超| 璧山县| 萨嘎县| 马山县| 高安市| 台南市| 乳山市| 丰都县| 泸西县| 辽宁省| 渝中区| 南投市| 阿荣旗| 蛟河市| 确山县| 泌阳县| 云霄县| 义马市| 河池市| 修水县| 庆云县| 阿巴嘎旗| 于都县| 乌海市| 阳泉市| 鞍山市| 高陵县| 铁力市| 永丰县| 绩溪县| 莱阳市| 淳安县| http://444 http://444 http://444 http://444 http://444 http://444