Sto provando a riprodurre un file PCM in Android utilizzando la classe AudioTrack
. Posso ottenere il file per riprodurre bene, ma non posso dire con affidabilità quando la riproduzione è finita. AudioTrack.getPlayState
indica che la riproduzione si è interrotta quando non è stata completata la riproduzione. Sto avendo lo stesso problema con AudioTrack.setNotificationMarkerPosition
, e sono abbastanza sicuro che il mio marcatore è impostato alla fine del file (anche se non sono completamente sicuro che lo stia facendo bene). Allo stesso modo, la riproduzione continua quando getPlaybackHeadPosition
si trova alla fine del file e ha smesso di incrementare. Qualcuno può aiutare?Come sapere quando l'oggetto AudioTrack ha finito di suonare?
12
A
risposta
14
Ho scoperto che l'utilizzo di audioTrack.setNotificationMarkerPosition (audioLength) e audioTrack.setPlaybackPositionUpdateListener ha funzionato per me. Vedere il seguente codice:
// 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
Questo funziona per me:
do{ // Montior playback to find when done
x = audioTrack.getPlaybackHeadPosition();
}while (x< pcmFile.length()/2);
Problemi correlati
- 1. ALSA: Come sapere quando un suono ha finito di suonare
- 2. Come posso sapere quando un elemento audio HTML5 ha finito di suonare?
- 3. LIBGDX: Come posso sapere quando un suono ha finito di suonare?
- 4. Come sapere quando un CompletionService ha finito di fornire risultati?
- 5. Come sapere quando il viewpager ha finito di caricare
- 6. Come sapere quando il TTS è finito?
- 7. Esegui un'azione quando un suono ha finito di suonare in AVAudioPlayer?
- 8. AudioTrack - come sapere quando un suono inizia/finisce?
- 9. come sapere evento Scroll ha finito con jQuery
- 10. query WebSQL Javascript all'interno di ciclo. Come sapere quando finito?
- 11. come rilevare quando un file mp3 ha finito di giocare
- 12. Come sapere se altri thread hanno finito?
- 13. node.js callback async.each, come faccio a sapere quando è finito?
- 14. Come faccio a sapere quando un ListBox ha finito il rendering in Silverlight?
- 15. come controllare quando UITableView ha finito di scorrere
- 16. Come rilevare quando un AVPlayerItem ha finito di giocare?
- 17. Come si determina quando Windows ha finito il riavvio?
- 18. Come si rileva quando un file audio ha finito?
- 19. Utilizzo di Spring Threading e TaskExecutor, come faccio a sapere quando un thread è finito?
- 20. AudioTrack: play() chiamato su AudioTrack non inizializzato
- 21. Android: come posso sapere quando gridview ha raggiunto il fondo?
- 22. Come sapere quando RecyclerView ha terminato la posa degli articoli?
- 23. Come fa a sapere quando il file è finito in C?
- 24. Jquery, come sapere quando l'input ha un: selettore non valido?
- 25. Come posso sapere quando MKMapview setRegion: animated: ha terminato?
- 26. Sapere quando le immagini hanno finito di caricare in risposta AJAX
- 27. AudioTrack riavvio anche dopo l'interruzione
- 28. Come posso controllare quando il mio ListView ha finito di ridisegnare?
- 29. Come rimuovere lo stato attivo da EditText quando l'utente ha finito di modificare?
- 30. Come determinare quando un browser ha finito di dipingere un elemento inserito?