2014-01-09 96 views
3

我正在嘗試解決Android OpenSLES中的以下問題。Android OpenSLES緩衝區飢餓問題

的OpenSLES規範說以下內容:

http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf - 8.12

當播放機在SL_PLAYSTATE_PLAYING狀態,這是 由SLPlayItf接口控制[見8.32],加入 緩衝區將隱式開始播放。在 由於隊列中緩衝區不足而導致飢餓的情況下,停止播放音頻數據。 播放器保持在SL_PLAYSTATE_PLAYING狀態。在排隊等待 附加緩衝器後,音頻數據的播放將恢復。請注意,排隊緩衝區的飢餓導致音頻數據流中出現可聽差距。在播放器未處於播放狀態的情況下, 添加緩衝區不會開始音頻播放。

唉,一旦我們到Android:

http://mobilepearls.com/labs/native-android-api/ndk/docs/opensles/index.html - 解碼音頻爲PCM

取決於平臺的實現,解碼可能需要不能被閒置 資源。因此,不建議 由於不能提供足夠數量的空PCM緩衝器而使解碼器不起作用,例如,通過從Android簡單緩衝區隊列中返回 而不排入另一個空的緩衝區。解碼器飢餓的 的結果是未指定的;執行時可能會選擇 或者丟棄解碼後的PCM數據,暫停解碼過程,否則會在嚴重的情況下終止解碼器。

這個非規範行爲已經完全停止了我的項目的進度,我失去了如何最好地解決它。將整個文件解碼到內存或磁盤上的pcm不是一種選擇,我真的需要這是一個流媒體解決方案。對此的任何幫助將大規模讚賞

回答

0

似乎沒有解決此問題的方法。其他項目似乎使用較低級別的API(如libstagefright)來進行解碼。該方法確實讓你得到的數據

[編輯] 有沒有辦法解決飢餓問題。 Android只是不遵守規範。基本上你需要緩衝到內存中,並確保在需要控制數據流時使用暫停和恢復解碼。

This is a discussion on the subject in the ndk google group