如何解决移动直播下的耳返延迟问题
??耳返是主持人或歌手在一些大型晚會現場會佩戴的一種電子設備。耳返其實是“使用耳機形式的返送”,它是包括耳機、無線接收器、無線發射器,混音器等一系列設備的總稱,與之對比的是“地返”,是指裝在舞臺前方固定的用來返送的音響。
?
對于歌手而言,演出現場往往是個很大的空間,會有聲音的延遲或變質,當歌手在現場演唱時往往聽不到自己的聲音,或者聽到伴奏時已發生延遲,所以需要耳返把伴奏送到歌手耳邊以保證他們不會唱錯拍子或走音走調。
?
耳返存在的問題
?
通過前面的介紹我們了解到,耳返的使用對延時性要求比較高,如果延時大于 30ms,人聽到的耳返聲音就會有“錯位”的感覺,如果大于 50ms 就會明顯感覺到延遲的存在。隨著延遲的不斷增大,對于演奏者來說,不但不能很好的通過耳返來及時調整演奏的節奏,甚至還會影響演奏的整體效果。
如上圖,耳返延時也就是聲音在設備上的往返延遲: 音頻信號進入移動設備的輸入組件,由應用處理器上運行的應用進行處理,然后從輸出組件傳出,這整個過程所花費的時間就是聲音的完整往返時間。影響耳機的往返延遲主要表現在以下幾方面:
?
1.移動設備中使用的揚聲器和麥克風由于設備類型多樣及質量參差不齊,在有些設備上通常音效較差,所以會通過增加信號處理功能來改善音質。此類信號處理會引起延遲。
?
2.對于同步輸入和輸出,每一側將使用單獨的緩沖區隊列完成處理程序。即使兩側采用相同的采樣率,也無法保證這些回調的相對順序或音頻時鐘的同步。應用應當緩存數據,并適當進行緩沖區同步,使用的數據緩存會引起延遲。
?
3.在音頻處理過程中由于音頻采集和播放的采樣率不統一或其他處理原因而進行的采樣率轉換,也會造成延遲。
?
4.數據第一次在緩沖區加入隊列后啟動音頻管道所需時間的長短也會產生不同的延遲。
移動端對聲音耳返的處理中,iOS 的表現明顯優于 Android。Android 端延遲的問題主要表現在: 系統 API 在不同機型上延遲表現存在多樣性,有些機型甚至會達到 300ms 的延遲,這樣完全不能滿足耳返的功能需求。
?
耳返實現的方式
?
1.通過 Android 提供系統 API 進行聲音的采集和播放,其特點是使用簡單。但由于是 Java 層的 API,無論是播放還是采集都需要將數據在 Java 層和 Native 層之間拷貝,影響性能且延遲較大。不同型號設備間,由于廠商對系統層不同的修改也會導致聲音延遲表現差別較大,范圍大致在 150ms-300ms 之間。
在 Android 設備上運行時,并不能確定通過任何路徑的音頻延遲時間,不過我們可以通過對下列硬件功能標記,來了解硬件設備是否能為延遲時間提供保證。
2.android.hardware.audio.low_latency 指示 45ms 或更短的持續輸出延遲時間。
3.android.hardware.audio.pro 指示 20ms 或更短的持續往返延遲時間。
可以通過如下代碼檢測:
為了最大限度的縮短延遲時間,我們需要獲取與設備最佳匹配的采樣率和緩沖數據大小。
以下代碼可以從 AudioManager 獲得最佳采樣率:
?
?
以下代碼可以從 AudioManager 獲取采用與獲得最佳采樣率相似的方式獲得最佳緩沖區大小。PROPERTY_OUTPUT_FRAMES_PER_BUFFER 屬性表示 HAL(硬件抽象層)緩沖區可以容納的音頻幀數。如果使用正確數量的音頻幀,會定期出現回調,而這將減少抖動。在不同的設備及不同的 Android build 中,HAL 緩沖區大小有所不同。
以上確定好設備的音頻采集播放的最佳參數后,我們就可以實現音頻的采集和播放功能了。在 Android 系統 API 中可以通過創建 AudioRecorder 和 AudioTrack 類實例來實現設備端的音頻采集和音頻播放。
?
?2.通過 openSL ES,實現復雜,延遲較小,而且有可控的延遲 buffer 可調。不論是編寫合成器、卡拉 OK、游戲還是其他實時應用,都可以使用 C 或 C++ 實現高性能、低延遲時間音頻。而且 Android 在 O 版本中引入 AAudio 作為 OpenSL ES 庫的輕量級原生 Android 替代項,專門針對低延時高性能的音頻應用設計,實現起來相對 openSL ES 要簡單許多,性能上也會相對更優。
?
對于聲明 android.hardware.audio.low_latency 功能的設備, 也可以通過前面的方法獲取設備的最佳采樣率、緩沖區,應用與 OpenSL ES 中,已實現設備上更短的延遲時間。
?
opengGL 的創建流程:
a. 創建對象(通過帶有 create 的函數)
b. 初始化(通過 Realize 函數)
c. 獲取接口來使用相關功能(通過 GetInterface 函數)
?
3.個別廠商提供的耳返接口: 有些手機廠商優化系統底層邏輯,針對 Android 系統的音頻耳返功能優化出最理想的效果,如: 華為、vivo、oppo 會有廠商提供的專門的耳返 API 調用,這種方式實現的耳返效果延遲相對最優。
?
為了針對不同 Android 手機實現最優的延遲效果,融云采用廠商 + openSL ES + 系統 API 的方式聯合實踐。當手機支持廠商提供耳返 API 時,融云音視頻 SDK 會優先使用廠商耳返功能,這樣可以使這部分手機在耳返功能上表現出最好的效果。針對不支持耳返功能的手機設備,融云音視頻 SDK 則采用 openSL ES 的方式實現耳返功能,使這部分手機可以通過 openSL ES 實現較好的耳返效果。由于 openSL ES 在復雜多樣的 Android 系統設備上存在兼容問題,針對這種情況,融云音視頻 SDK 會采用 Android ?系統 API 提供耳返功能,以確保音視頻 SDK 的穩定性。這樣融云音視頻 SDK 不僅能最大程度的降低 Android 設備的耳返延遲效果,而且可以最大限度的兼容不同的 Android 設備。????
總結
以上是生活随笔為你收集整理的如何解决移动直播下的耳返延迟问题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Linux下使用find命令查找图片
- 下一篇: Java基于springboot+vue
