2010-02-22 123 views
2

我需要能夠從Android系統的C++端自定義文件格式流式傳輸音頻。我正在移植一個自定義媒體播放器,並需要能夠打開一個自定義文件並從中流式傳輸音頻。這一點很重要,因爲我不認爲將整個播放器移植到JAVA從性能角度來說是可行的,並且通過JNI接口移動音頻緩衝器,我相信這樣做會太慢而不能保持體面的幀速率。我可以通過OpenGL ES處理NDK端的視頻,但音頻我不知道如何做到這一點。Android從C++端播放原始音頻

回答

1

NDK目前不支持播放音頻幀。你必須使用java AudioTrack API來實現這一點。

2

我建議你通過JNI傳遞音頻,看看它是如何實際執行的。我發現JNI實際上非常高效(如果正確實施),並且如果它足夠快以滿足您的需求,不會感到驚訝。

只是關於實現的一個註釋,不要讓Java在每次想要傳遞音頻時都創建一個緩衝區,只需在Java中創建一個緩衝區(或者通過JNI),然後在每次需要時使用memcpy創建一個緩衝區更新。

另外,你應該注意到Android上的所有音頻類目前都是用C++編寫的並且通過JNI運行。如果它的速度足夠快(我目前正在開發一款遊戲,我們可以在一些框架上提交超過0.5MB的Java音頻數據到AudioTrack中),那麼它可能不會太壞轉到另一個基本相同的操作,即鎖定緩衝區,寫入,解鎖到音頻以及鎖定緩衝區,讀取音頻類中的解鎖。