我在使用 Libgdx 開發的 Android 游戲中使用 mp3 檔案播放聲音。聲音在不時發生時播放得很好,但是當我快速播放它們時(例如正在運行的影片中的腳步聲),游戲會凍結/結結巴巴。
每次播放聲音時,我都會在日志中得到這個:
W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44100 Hz, output 48000 Hz
我使用 libktx AssetStorage 來存盤聲音。幾天來我一直在尋找這個問題,但沒有得到以下任何解決方案的運氣:
- 在 AndroidLauncher 中覆寫 createAudio 并使用 AsynchronousAndroidAudio
- 將 mp3 轉換為 ogg(使用 Audacity)
- 轉換為 48k 速率樣本(使用 Audacity)
- 為檔案添加 1 秒或 1 秒的靜音
我在我自己的設備三星 Galaxy S5 上對其進行了測驗,該設備相當老,版本為 Android 6.0.1。
我能做些什么來解決這個錯誤和口吃?
uj5u.com熱心網友回復:
解碼壓縮音頻可能是一個重要的處理負載。如果是一段簡短的錄音(例如,一個正在重復的腳步聲),我會將聲音檔案打包為 .wav 或將其解碼為 PCM 以保存在記憶體中,然后以這種方式使用它。IDK 如果可以直接使用 libgdx 輸出 PCM,但我確實記得檢查和修改 ogg 實用程式以將其解碼為陣列,并使用SourceDataLine非 libgdx Java 專案輸出它。我意識到SourceDataLine輸出不是 Android 的選項,但 Android 確實有播放原始 PCM 的規定。
另一個要探索的想法是將處理音頻的執行緒的優先級提高到Thread.MAX_PRIORITY如果 libgdx 允許這樣做。從理論上講,音頻處理執行緒的大部分時間都處于阻塞狀態,因此這樣做不會損害性能,除非您的音頻請求真的過火了。
我剛剛看到采樣率的不匹配。當您可以在 Audacity 中進行一次轉換時,反復進行即時轉換是很浪費的。我猜輸出 48000 和 44100 之間的差異并沒有那么大的負載差異。在我看來 44100 應該沒問題,但我懷疑使用 48000 會在 CPU 負載(或可感知的音頻保真度)方面增加很多。因此,無論您選擇哪一個,都要花一點時間確保所有資產都符合格式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/490825.html
