2013-12-18 49 views
0

我在我的Android apps之一中使用了openSL ES。當應用程序在前臺時,回調非常規則。麥克風回調大約每10ms調用一次,揚聲器回調也是如此。但是,如果我將應用程序放在後臺並打開瀏覽器(或其他應用程序),則可以看到在打開瀏覽器(或瀏覽)時觸發了「回調風暴」。有沒有辦法解決這個問題?爲什麼會發生? openSL補償一段時間無法執行回調嗎? (就像它試圖趕上)。openSL ES Android:不規則音頻回調

我的源代碼在C和我在Jelly Bean 4.3.

我試圖增加AudioTrackAudioRecorder線程的優先級,並且它似乎幫助,但我不知道那是辦法走。

其他問題

你是說,即使增加線程優先級你可能會得到回調一陣,你應該放棄那些?

這是一個很好的解決方案嗎?您將丟棄麥克風包(或者耗盡揚聲器包的來源),對吧?如果不丟棄話筒包,話筒包的接收器會將話筒包的突發解釋爲過度的抖動,對吧?

更重要的是:我手動增加了AudioTrack和AudioRecorder的線程優先級,並將sched策略改爲循環法。它需要同時訪問和安裝BusyBox(隨命令行util改變線程優先級/調度策略)。這是如何通過編程從C完成的?我想確保它是增加的單個線程優先級,而不僅僅是我的應用程序(進程)的優先級。

+0

您是否因*缺失*回調而遭遇風暴?或者超出你的預期? – marko

+0

我在他們缺席之後得到了延遲迴調的風暴。 – user1884325

+0

當您的應用程序進入後臺時,您是否遇到任何音頻斷斷續續或退出? – rmigneco

回答

1

是的,這是設計。試圖推動線程優先級最高的是合法的解決方法。確保使用原生緩衝區大小和採樣(請參閱Low-latency audio playback on Android)以獲得最佳結果。您仍然應該準備放棄回調突發,因爲無法保證它們永遠不會發生。您還應該嘗試在應用程序處於後臺時減少總體CPU消耗和RAM腳標。

+0

所以你說,即使線程優先級增加,你可能會遇到一連串的回調,你應該放棄這些回調?這是一個很好的解決方案嗎?您將丟棄麥克風包(或者耗盡揚聲器包的來源),對吧?如果不丟棄話筒包,話筒包的接收器會將話筒包的突發解釋爲過度的抖動,對吧?我編輯了我原來的問題。你能否解決其他問題?謝謝。 – user1884325

+0

更多答案:我沒有說即使你努力嘗試,爆發仍然會發生,這很好。但不幸的是,沒有任何保證,回調將始終以可忽略的抖動到達。不要殺死信使。 –

+0

關於生根和調整線程調度器,methinks這是一個錯誤的路徑。如果您正在構建基於Android的定製硬件解決方案,那麼您可能應該首先將一些RT補丁應用於內核。否則,即使不太經常,爆發仍會發生。無論如何,您[可以設置單個線程優先級](https://groups.google.com/forum/m/#!topic/android-developers/b2SKprSxPvw)與Process最大一樣高。THREAD_PRIORITY_URGENT_AUDIO = -19;',請參閱 –