2010-09-04 27 views
12

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?

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