Android的音頻延遲問題變得更糟了 Android 8系統音頻架構帶來的新問題「Gabor (szantog)」
- 原文地址:Android Audio Latency Problem Just Got Worse,作者Gabor (@szantog)。
本文介紹了Android 8系統帶來的音頻系統BUG導致的延遲問題。前文可參閱[Doc]Link=00006276[/Doc],文章內容不代表本站觀點。
不,Android 8.0,告訴我這不是真的!
當壞消息發言人很不爽,但在Android 8.0下,安卓的10毫秒問題變得更為嚴重。你沒看錯:Android 8.0的音頻延遲比Android 7.0更高了。如果你在為安卓平台開發以下類型的互動式音頻程序集成,例如:AR/VR、語音助手、VOIP應用、語音會議應用、電子樂器、數字音頻工具、卡拉OK等等,這些應用程序的性能將受到負面影響。
本文概要
我們的測試表明在Android 8.0下,當音頻輸入不是單聲道時,音頻迴路的延遲性能比以前的Android版本顯著變差。我們向谷歌的音頻開發組分享了研究結果並更新了我們的延遲測試APP。數據和測試方法見下文。
*有趣*的是,某位Android音頻開發組的推广部員工,公開表示我們的觀點是錯誤的,認為Android 8.0的延遲並沒有惡化——只要按照他的「妙招」——程序猿將錄音從雙聲道改成單聲道模式就沒問題[因為這是谷歌在Android快速音頻模式中的一個BUG]。
技術背景
在幾周前,Android音頻組的一個成員向我們告知,我們的Superpowered音頻延遲測量APP在Android 8下出現工作異常。延遲測量步驟之間的誤差太大,而且測試結果比谷歌自己的測量方式更高。現在有兩款可以測量安卓音頻迴路延遲的應用。谷歌自己的「Rick"O"Rang APP」和Superpowered"s Latency Test,這兩款應用均完全開源。它們的測試方式並不相同,但結果同場近似,實際上基本接近一致。
3.5mm的音頻環回適配器流程圖和樣品
谷歌的Rick"O"Rang應用需要一個被稱為音頻環回適配器的特殊3.5mm插頭並接上手機的耳機介面,使音頻出現迴路反饋噪音[拉爾森效應]。這個應用通過迴路噪音的周期計算音頻迴路的延遲。應用還能測量「音頻連續性」來檢測故障。
Superpowered Latency Test應用則無需特殊硬體即可運行。它可通過手機內置麥克風和外放喇叭、USB音效卡、迴路器或其它音頻設備。應用在音頻通道輸出一個特定信號,然後開始計時至音頻輸入通道接收到信號。 測試會重複10次以濾除測試誤差和其它因素。
再次強調,兩款APP的測試結果在過去是相似的,幾乎完全一致,因此形成了相互制衡的作用,直到Android 8出現……通過在我們手上的Nexus 6P運行的應用中加入一些主要異常信息日誌的顯示,作為谷歌在音頻延遲改進的部分,在Android 4.4和7之間的版本中,使用OpenSL ES音頻API在應用端需要的輸入和輸出緩衝器只需要1[一個]。輸入和輸回調所填充或消耗的緩衝總是處於一個接一個的單列排隊:
輸入,輸出,輸入,輸出,輸入,輸出……
但在Nexus 6P[Android 8.0下]表現得極為不同:
輸入,輸入,輸入,輸入,輸出,輸出,輸出,輸出,輸入,輸入,輸入,輸出,輸出,輸出,輸出……
連續輸入和輸出的數量在3~5間波動,這種行為是意外和異常的。這實在是出乎意料,谷歌和Superpowered的延遲測試程序僅用了1個緩存器。 但一個緩存不足以覆蓋5次工作,因此所有的測試變得不穩定和不準確。 由於音頻IO在非單調調度中可能會出現連續輸入,程序無法在下一次回調時對輸入緩存做出響應,最終導致音頻迴路的延遲增加。
在Superpowered Latency Test修復之前,由於我們的應用出現了延遲值的波動,所有在安卓8上運行的用戶都可以馬上看到一些不對頭,但谷歌的應用顯示了良好、合理的而且更低的延遲值。雖然谷歌的故障測試表明有問題,但許多用戶只是無視了這些。因為故障檢測不像延遲測試那樣「亦可賽艇」[是一個單獨的功能]。故障的數量應該為零,但在運行Andorid 9的Nexus 6P上,每次測試都有兩到三個。
我們已經修改了延遲測試程序使其能處理緩存的異常,最多到128個緩存區[非常高的數值],我們的實現方式並不是針對Andorid 8的。我們的目標是使其可以不經過任何調整而在每一個版本的安卓上運行。我們已經在多個設備上進行了詳細的測試,以確保它仍然可以提供相同、可信的測試數值。
在過去幾年裡,我們的延遲測試應用已經收集了世界上最大的移動音頻延遲資料庫,在將近8000個不同的設備型號/系統版本中有超過320000個測試數據,所以我們有大量的數據來衡量基準。
谷歌會修正嗎?
我們已經把這些發現發送到谷歌的Rick"O"Rang的app作者,在谷歌的app修正後我們會在本文更新[譯者註:並沒有]。
快速模式發生了什麼?
低延遲音頻效果的一個重要功能是所謂的「Android快速混音器」。如果一個程序選擇快速音頻路由[而且設備支持],音頻的延遲就會好得多得多。在Android 8以前Nexus 6P高興地完成了快速路徑。但現在我們看到了:
OpenSL ES | AAudio | |
音頻輸入 | FLAG_FAST 成功, frameCount 192 | FLAG_FAST 成功, frameCount 1536 |
音頻輸出 | FLAG_FAST 拒絕, frameCount 1536 | FLAG_FAST 拒絕, frameCount 1536 |
快速混音器被拒絕用於音頻輸入,僅能適用於AAudio模式下的音頻輸出,但幀數[譯者註:並非顯示中的幀率,音頻子系統能處理的幀數是固定的,幀數越高會導致延遲越大]太高,相當於非快速模式下的幀數。值得注意的是,AAudio並沒有通過獨佔模式中的「快速混音器」[我們正在用],而是直接與HAL對話。
Android 8.0沒做好
當我們修復了延遲測量應用後,許多人會好奇,Android 8.0能有多大進步?呃,其實並沒有改善,而是更糟了……
音頻迴路延遲[使用OpenSL ES] | 內置麥克風和喇叭Android 7 | 內置麥克風和喇叭Android 8 | 性能提升百分比 |
Nexus 6P | 33ms | 68ms | -106% |
Pixel XL | 29ms | 60ms | -107% |
音頻迴路延遲[使用OpenSL ES] | 迴路器Android 7 | 迴路器Android 8 | 性能提升百分比 |
Nexus 6P | 17ms | 60ms | -253% |
Pixel XL | 16ms | 40ms | -250% |
很明顯,Android音頻系統的內部發生了一些事情。
新的AAudio API
Android 8帶來了新的API,AAudio,它比老舊的OpenSL ES介面更優秀。AAudio更容易理解,更容易使用而且生成的代碼更為緊湊和精簡。這個API的公告吹牛稱Android 8的音頻能力更加優秀。讓我們看看它的實際能力如何:
音頻迴路延遲[Nexus 6P] | OpenSL ESAndroid 8 | AAudio,Android 8 | OpenSL ESAndroid 7 |
內置麥克風和外放 | 68ms | 60ms | 33ms |
迴路器 | 60ms | 40ms | 17ms |
在Nexus 6P上你可以在Android 7系統得到好得多的延遲表現,無論Android 8用什麼音頻API。
使用單聲道!
在向谷歌告知這些測試的之後,他們提醒了我們一個關於谷歌的內部代碼BUG,如果輸入通道數量減少至1(單聲道),那麼快速標籤就會在音頻輸入中可以通過,而且延遲得到改善:
音頻迴路延遲[Nexus 6P] | OpenSL ES,Android 8單聲道 | AAudio,Android 8單聲道 | OpenSL ES,Android 7 |
內置麥克風和外放 | 36ms | 38ms | 33ms |
迴路器 | 20ms | 21ms | 17ms |
重申一次:這個方法只有在單聲道輸入時有效。在Android 7下是沒有效果的。
谷歌視圖說服我們,單聲道是一個很好的解決方案,但我們並不認同。一些應用中並沒有單聲道的選項[類似多聲道錄音或錄像工具、DJ等],但更重要的是:你Y認真的???
AAudio和舊版Android?
如果你只使用AAudio庫開發,應用在Android舊版本上會崩潰。目前還沒有「官方」途徑說明如何構建AAudio和舊版本安卓兼容應用的方法。
在Superpowered延遲測試應用中,我們展示了一種構建能與舊版Android兼容應用的方法,我們的方案還可以免於維護兩個不同版本的本機庫和代碼庫。簡而言之,解決的方案是:雖然CMakeLists.txt將創建兩個不同的庫[一個有AAudio,一個沒有],但兩個庫的源代碼是相同的。
AAudio緩存大小警告
如果你使用AAudio開發,請時刻注意每一次音頻回調的緩存大小是不一致的。在Nexus 6P上通常看起來會是這種序列:192,128,64,192。這對於音頻開發者來說並不是未知數,然而對於常規的應用開發序猿而言則是非常驚人的意外。
Superpowered針對Android音頻開發者的建議和調整
在技術背景章節中展示了Android 8下的OpenSL ES出現了一個嚴重的問題。我們的建議如下:
如果你已經在OpenSL ES寫了「1緩存」在音頻IO代碼中,那你應當立即更新程序,因為Android 8下它會導致輸出亂碼音頻,接收到的也是亂碼音頻。
如果你使用SuperpoweredAndroidAudioIO作為音頻IO,那麼你將是完全安全的,它有一個不受到這個問題影響的機制,會正常工作。
推遲AAudio使用,直到我們能看到它在非谷歌設備的Android 8系統上如何工作,以及谷歌如何解決Nexus 6P和Pixel XL的延遲問題。
截至2017年10月,SuperpoweredAndroidAudioIO不會支持AAudio,但我們會密切關注形勢,如果得到了改善,我們就會加入支持。
SAPA乙烷
中斷一下我們的公告,我們在Superpowered延遲測試應用已經移除了SAPA(三星專業音頻SDK)的支持,因為它最新的更新也沒有支持64位系統。
為了SAPA維護一套單獨的32位代碼庫已經沒有任何價值,實際上對於大多數開發商來說,這樣做的代價太高了。SAPA曾經是三星試圖解決安卓音頻延遲問題的一個有趣實踐,但不幸的是它從沒有真正發布過,我們已經盡所能來長時間維持了。Vaya con Dios老夥計!
前進的道路依然不明晰
谷歌長期一直在試圖滿足專業音頻開發商的需求,從2011年起每年都定期發布公告。Google Play的音樂類應用遠遠落後於App Store,沒錯,Google Play在音樂類相關收入普遍於蘋果。但音樂類應用收入遠遠低於預期,Android音頻的技術問題佔了主要貢獻。
我們大多數人都希望事情能逐步向前發展,有朝一日為Android創建專業音頻應用也能和iOS一樣變得非常有價值,我們想像中的發展指數曲線是這樣的:
想像中的音頻技術發展
或者說,大多數企業家都在思考:
- 「情況正變得越來越好,專業的安卓音頻設備數量正在積累,對我而言在Android專業音頻上做一些投入是有意義的,我在密切關注它能如何發展。」
然而我們得到的卻是這個:
現實中的音頻技術發展
Android 7.0.1在CPU調度中存在嚴重缺陷,使得高負載處理的音頻應用會在後台模式下產生嚴重的音頻丟失。現在我們得到了Android 8,又大幅增加了一些設備的音頻延遲。這把我們帶到了:
- 「情況總體上在好轉,但發展道路上主要的槽點在阻止專業安卓音頻設備的積累,這導致影響了我在Andorid專業音頻做一些投入的價值。不幸的是,很多老Android設備並不會升級系統,在更新7.0.1或8.0來之前就已經停止更新或者被遺忘了。我在密切關注它能如何發展。」
我們將繼續盡我們所能幫助谷歌,也將繼續提供專業的音頻工具,使專業Android音頻項目成為可能。我們真摯希望能在將來某一天Android能與iOS的音頻性能相匹配,為這個平台帶來工具和幾十億美元的機遇。
※Oculus Go 一體式頭戴VR設備 圖集「Soomal」
※福徠斯 FLC 8n三單元圈鐵入耳式耳機測評報告「Soomal」
TAG:數碼多 |