我試圖在Android中使用AudioTrack
類播放PCM文件。我可以讓文件播放得很好,但我無法可靠地判斷播放何時完成。 AudioTrack.getPlayState
表示播放未完成播放時已停止播放。我與AudioTrack.setNotificationMarkerPosition
有同樣的問題,並且我很確定我的標記被設置爲文件的末尾(雖然我不完全確定我是正確的)。同樣,當getPlaybackHeadPosition
位於文件末尾並停止遞增時,將繼續播放。誰能幫忙?如何判斷AudioTrack對象何時完成播放?
12
A
回答
14
我發現使用audioTrack.setNotificationMarkerPosition(audioLength)和audioTrack.setPlaybackPositionUpdateListener爲我工作。請看下面的代碼:
// Get the length of the audio stored in the file (16 bit so 2 bytes per short)
// and create a short array to store the recorded audio.
int audioLength = (int) (pcmFile.length()/2);
short[] audioData = new short[audioLength];
DataInputStream dis = null;
try {
// Create a DataInputStream to read the audio data back from the saved file.
InputStream is = new FileInputStream(pcmFile);
BufferedInputStream bis = new BufferedInputStream(is);
dis = new DataInputStream(bis);
// Read the file into the music array.
int i = 0;
while (dis.available() > 0) {
audioData[i] = dis.readShort();
i++;
}
// Create a new AudioTrack using the same parameters as the AudioRecord.
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, RECORDER_SAMPLE_RATE, RECORDER_CHANNEL_OUT,
RECORDER_AUDIO_ENCODING, audioLength, AudioTrack.MODE_STREAM);
audioTrack.setNotificationMarkerPosition(audioLength);
audioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener() {
@Override
public void onPeriodicNotification(AudioTrack track) {
// nothing to do
}
@Override
public void onMarkerReached(AudioTrack track) {
Log.d(LOG_TAG, "Audio track end of file reached...");
messageHandler.sendMessage(messageHandler.obtainMessage(PLAYBACK_END_REACHED));
}
});
// Start playback
audioTrack.play();
// Write the music buffer to the AudioTrack object
audioTrack.write(audioData, 0, audioLength);
} catch (Exception e) {
Log.e(LOG_TAG, "Error playing audio.", e);
} finally {
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
// don't care
}
}
}
3
這個工作對我來說:
do{ // Montior playback to find when done
x = audioTrack.getPlaybackHeadPosition();
}while (x< pcmFile.length()/2);
相關問題
- 1. 如何判斷AVAudioPlayer播放完畢
- 2. 如何判斷對象初始化程序何時完成
- 3. ALSA:如何判斷聲音何時播放完畢
- 4. 如何判斷animateLayoutChanges何時完成?
- 5. 如何判斷Image.FromStream完成
- 6. 如何查找audioTrack已完成/停止播放?
- 7. 如何判斷對象何時發送釋放消息?
- 8. 如何判斷空對象?
- 9. 如何判斷MXML組件何時完全創建完成?
- 10. LIBGDX:如何判斷聲音何時播放?
- 11. 如何判斷QTMovie何時開始播放?
- 12. 如何判斷JUnit何時通過使用TestWatcher完成?
- 13. Android:如何判斷服務何時完成
- 14. wpf如何判斷數據綁定何時完成?
- 15. 如何判斷Directshow.net轉換何時完成?
- 16. 如何判斷請求何時完成(ASIHTTPRequest)?
- 17. 如何判斷dde響應何時完成?
- 18. 如何判斷dom重複何時完成衝壓元素
- 19. 如何判斷我的EAP呼叫批次何時完成?
- 20. 如何判斷location.reload()何時完成刷新頁面?
- 21. 如何判斷IPC :: Run作業何時完成
- 22. 如何判斷MKMapView和可見MKAnnotationView何時完成繪圖?
- 23. 如何判斷使用TweenLite時Tween是否正在播放?
- 24. MooTools:如何判斷對象是數組?
- 25. 如何判斷對象是否爲空?
- 26. 如何判斷TypeScript對象的類型?
- 27. 如何判斷通過AppleScript完成iPod同步的時間
- 28. 你如何判斷你是否需要釋放一個對象?
- 29. 如何判斷是否放置了一個IDisposable對象引用?
- 30. 如何在模板中存在對象時如何判斷對象?