Próbuję odtworzyć plik PCM w systemie Android przy użyciu klasy AudioTrack
. Mogę sprawić, że plik będzie dobrze odtwarzany, ale nie mogę rzetelnie stwierdzić, kiedy odtwarzanie się zakończyło. AudioTrack.getPlayState
mówi, że odtwarzanie zatrzymało się, gdy nie zakończyło się odtwarzanie. Mam ten sam problem z AudioTrack.setNotificationMarkerPosition
i jestem prawie pewien, że mój znacznik jest ustawiony na koniec pliku (chociaż nie jestem całkowicie pewien, czy robię to dobrze). Podobnie odtwarzanie jest kontynuowane, gdy getPlaybackHeadPosition
znajduje się na końcu pliku i zatrzymało inkrementację. Czy ktoś może pomóc?Jak stwierdzić, kiedy obiekt AudioTrack zakończył odtwarzanie?
12
A
Odpowiedz
14
Znalazłem, że za pomocą funkcji audioTrack.setNotificationMarkerPosition (audioLength) i audioTrack.setPlaybackPositionUpdateListener pracowałem dla mnie. Zobacz następujący kod:
// 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
Działa to dla mnie:
do{ // Montior playback to find when done
x = audioTrack.getPlaybackHeadPosition();
}while (x< pcmFile.length()/2);