1. 程式人生 > >直播疑難雜癥排查(8)— 播放雜音、噪音、回聲問題

直播疑難雜癥排查(8)— 播放雜音、噪音、回聲問題

直播 回聲 音視頻 雜音 噪聲

本文為 《直播疑難雜癥排查》系列的第八篇文章,我們重點看看直播過程中出現的雜音、噪音和回聲等問題。


相比於視頻而言,音頻要敏感得多,視頻畫面有噪點、馬賽克都還是可以勉強被接受,而聲音一旦有任何瑕疵,人耳都會特別容易感覺到,而且難以忍受。


1. 問題現象


常見的音頻問題現象描述如下:


- 電流音,爆音,滋滋聲或者嘟嘟聲

- 聲音斷斷續續,聽不清楚

- 回聲,能聽到自己說話的聲音


2. 問題排查


2.1 參數配置問題


上面也有提到,音頻是一個特別敏感的東西,涉及到許多參數配置,一旦配置不太匹配,就會導致聲音聽起來非常詭異(比如:采樣率是 32000Hz 的音頻,給播放器配置為 8000Hz 或者 44100Hz,就明顯會出現音頻慢放或者快放的效果)。


常見的音頻參數和基本原理,可以參考我的這篇文章,這裏就不再贅述了:《Android音頻開發(1):基礎知識》


我們只需要註意的是,無論是采集和播放,都要給系統的 API 以及第三方的庫配置正確的參數,如:采樣率、位寬、聲道數等等。


2.2 代碼層面的原因


常見的代碼層面的問題有如下幾種:


- 音頻 buffer 大小不匹配,一段 1024 bytes 的音頻,放到了 2048 bytes 的數組,導致尾部有隨機數

- 音頻 resample 重采樣的算法問題,導致采樣出來的數據出了問題

- Android 的 ByteBuffer 取出數組,是不能直接用 .array() 方法的,而需要用 .get() 方法

- iOS 系統,其他 app 通過系統 API 更改了 AudioSession 采樣率的配置


2.3 網絡波動


視頻是一幀一幀連續的圖像構成的,在播放過程中,如果無法按時渲染,則會出現卡頓的效果;如果丟失幾幀畫面,則會出現快進效果。


而音頻是流式的,雖然也被切分為了一個個音頻幀,但如果無法按時播放或者連續丟失較多的音頻幀,則會明顯聽到斷斷續續的聲音出現。特別是在弱網、丟包率高等不穩定網絡環境下,很容易出現這種情況。


2.4 回聲消除


回聲一般出現在同時有音頻的采集和播放的場景,比如:連麥互動、混音返聽等等,采集到的音頻通過揚聲器又播放出來了,同時又被采集了進去,從而產生了回聲或者嘯叫聲。


這樣的場景下,一般需要通過系統的回聲消除 API,或者第三方回聲消除庫(如:speexdsp,webrtc 等)進行處理。


註意:很多 Android 機型硬件自帶的回聲消除效果並不是很好。


2.5 混音越界


音頻的 PCM 數據,通常用 short 數組來存放,當我們做一些多路音頻的混音功能的時候,如果不註意處理 short 類型的大小越界,則往往帶來爆音的問題。下面是一段參考 webrtc 的混音代碼,專門針對混音越界做了簡單處理,可以參考參考:

技術分享

3. 小結


關於直播雜音、噪音、回聲問題的問題排查大致就介紹道這裏了,有任何疑問歡迎來信 [email protected] 交流,另外,歡迎關註我的新浪微博 @盧_俊 或者 微信公眾號 @Jhuster 獲取最新的文章和資訊。

技術分享

本文出自 “Jhuster的專欄” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/1933255

直播疑難雜癥排查(8)— 播放雜音、噪音、回聲問題