首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Android 音頻 UnderRun 問題深度排查與 3ms 修復實戰

     編輯:Java 綜合教學

Android 音頻 UnderRun 問題深度排查與 3ms 修復實戰

問題現象

設備從 Android M 升級 N 過程中,騰訊視頻播放一段時間後出現「噠噠」彈跳噪音(pop-click),疑似音頻 UnderRun。

日誌鐵證

開啟 Verbose Log 復現,關鍵日誌:

V AudioFlinger: track(0xea5dda80) underrun, framesReady(1024) < framesDesired(1026)
V AudioFlinger: mixer(0xeb440000) throttle begin: ret(4096) deltaMs(0) requires sleep 10 ms
D AudioFlinger: mixer(0xeb440000) throttle end: throttle time(20)

證實:播放需 1026 幀,APP 僅準備 1024 幀,系統已觸發 throttle 機制(usleep 阻塞 PlaybackThread 讓 APP 補數據),但延遲仍不足。

源碼級分析

核心邏輯位於 frameworks/av/services/audioflinger/Threads.cpp 的 AudioFlinger::PlaybackThread::threadLoop():

  1. 檢測寫入間隔 delta = now - mLastWriteTime 超過 maxPeriod 判定延遲寫入。
  2. 若距上次警告超過 kWarningThrottleNs (5ms),標記 Underrun 並記錄警告。
  3. 啟用 mThreadThrottle 時,計算 throttleMs = mHalfBufferMs - deltaMs,呼叫 usleep(throttleMs * 1000) 阻塞線程。

修復方案

經測試,原有 throttle 時間對騰訊視頻仍不足。在 usleep((throttleMs + 3) * 1000) 中額外增加 3ms(註釋標註 20161216 修復該問題),重編系統鏡像燒錄驗證,噪音消失,問題解決。

擴展閱讀

  • 《音頻出現 Xrun(underrun 或 overrun)的原因與解決辦法》
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved