2014-02-21 27 views
1

尋找一些有關Android上音頻播放的幫助。我們有一個OpenGL應用程序(Java + C++),現在我們想播放聲音效果。玩家應該允許在玩時修改回放速度和音量。 可能是OpenSL或Audiotrack。多個音頻播放器(Java或C++),可以實時修改

第一個問題?是否有任何免費或商業庫/包裝,可以做的事情嗎?(可能是Java或本地)

..,如果沒有,我會解釋一下我們迄今所取得的,我們遇到問題。

我們用AudioTrack實例創建了MusicPlayer類(擴展了AsyncTask)。在activity的onResume()中,我們創建了5個實例,並在線程池中執行它。在任務的doInBackground()我們有一個運行循環檢查狀態變化,加載文件和寫入緩衝區。在JNI中,我們有單例存儲事件隊列並每10毫秒將它們發送給java一次。它以某種方式起作用,但距離被接受還有很遠的距離。我們遇到以下問題:

  1. 當文件開始播放時,我們可以聽到開始時出現短暫的噪音。像點擊或其他。
  2. 即使我們沖洗或釋放AudioTrack似乎聲音隊列播放(特別是當需要改變緩衝區快)
  3. 我們不能創造MODE_STREAM
  4. 當我們修改的AsyncTask的局部變量CHANGE_RATE和速率循環它應該調用audioTrack.setPlaybackRate(RATE)。它確實,但沒有任何反應。

我曾經用iOS編寫Obj-C,有很多「隨時可用」的解決方案(例如cocoacontrols)。從來沒有想過在Android上處理聲音將是這樣的噩夢; /任何幫助將不勝感激:)

+0

_「我們無法在MODE_STREAM中創建循環」_爲什麼不能?你正在填寫你寫入'AudioTrack'的緩衝區。如果您一次又一次地使用相同的PCM數據填充緩衝區,則會一遍又一遍地聽到相同的PCM數據。 – Michael

+0

@Michael謝謝你的迴應。以類似的方式完成它 - 現在可以工作:)我們還刪除了幾個第一個字節,而現在我們沒有點擊。主要問題是我們將整個文件一次發送到緩衝區。現在我們將其拆分爲3072b個零件,現在可以。 – rafalczuj

回答

0

Android 4.0或更高版本不支持播放速率控制了。我不確定禁用它的原因是什麼。我不得不採用由SoundTouch庫實現的SOLA算法來爲我的應用添加回放速率控制。

如果您想使用它,您需要使用OpenSL編寫播放器。周圍有很多實例。在將流發送到輸出接收器之前,先採用這些算法並將其用於修改PCM流。

更新22.01.2016: Android似乎包含Sonic庫到6.0版本。因此播放速率控制應該從Android M開始可用。

+0

我試着用AudioTrack,它工作得很好 - 改變播放速度沒有問題。但出於性能原因,我必須從Java的AudioTrack轉移到OpenSL。不同的方法不同的問題:)剛做了一個新的話題:http://stackoverflow.com/questions/23083874/opensl-audio-player-playback-rate-works-only-for-values-500-1000-2000 – rafalczuj

+0

..由於某種原因現在被刪除... – Ewoks

+0

我在我的應用中使用了Sonic庫,我在上面的帖子中提到過。如果您想了解它聽起來如何,請訪問以下網址:https://plus.google.com/u/0/communities/102599894094628040492 –