Android的音頻延遲問題變得更糟了 Android 8系統音頻架構帶來的新問題
Gabor (@szantog) 于 2018.08.05 22:50:02 | 源自:www.soomal.com | 版權:原創 | 平均/總評分:09.91/436

不,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,這兩款應用均完全開源。它們的測試方式并不相同,但結果同場近似,實際上基本接近一致。

  • 谷歌的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 ES
    Android 8
    AAudio,
    Android 8
    OpenSL ES
    Android 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的音頻性能相匹配,為這個平臺帶來工具和幾十億美元的機遇。

    請評分
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    123.116.156.***
    123.116.156.***
    發表于2019.06.06 17:07:08
    89
    125.076.212.***
    125.076.212.***
    發表于2019.05.13 10:02:59
    88
    113.074.126.***
    113.074.126.***
    發表于2019.04.24 00:48:21
    87
    039.169.202.***
    039.169.202.***
    發表于2019.04.20 13:16:21
    86
    124.205.077.***
    124.205.077.***
    發表于2019.04.11 18:37:33
    85
    125.077.130.***
    125.077.130.***
    發表于2019.04.01 21:08:57
    83
    060.021.098.***
    060.021.098.***
    發表于2019.03.10 13:48:36
    82
    203.156.220.***
    203.156.220.***
    發表于2019.02.26 18:52:22
    81
    111.061.***.***
    111.061.***.***
    80
    03

    此帖使用Win10提交
    發表于2019.01.30 14:48:05
    79
    218.250.249.***
    218.250.249.***
    發表于2019.01.26 20:44:58
    78
    116.199.102.***
    116.199.102.***
    發表于2018.12.23 08:33:09
    77
    211.137.242.***
    211.137.242.***
    發表于2018.12.14 15:25:52
    76
    221.233.110.***
    221.233.110.***
    發表于2018.11.27 22:52:47
    75
    116.227.200.***
    116.227.200.***
    發表于2018.11.21 22:15:07
    74
    103.044.035.***
    103.044.035.***
    發表于2018.11.17 06:04:05
    73
    180.158.084.***
    180.158.084.***
    發表于2018.10.31 14:08:06
    72
    220.200.056.***
    220.200.056.***
    發表于2018.10.19 01:14:27
    71
    提示
    本貼不可匿名回復,回復等級為:1 ,您現在正處在潛水狀態
    回復
    驗證碼
    2753 為防止廣告機貼垃圾,不得已而為之
    表情
    正文
    京ICP備11010137號 京ICP證110276號 京公網安備110114000469號