2010-09-04 16 views
12

Android'de AudioTrack sınıfını kullanarak bir PCM dosyasını oynatmaya çalışıyorum. Dosyayı sadece iyi oynayabilirim, ancak oynatmanın ne zaman biteceğini güvenilir bir şekilde anlayamıyorum. AudioTrack.getPlayState, oynatmayı bitirmediğinde oynatmanın durduğunu söylüyor. Ben AudioTrack.setNotificationMarkerPosition ile aynı sorunu yaşıyorum, ve ben eminim benim işaretleyici dosyanın sonuna kadar ayarlanmış (her ne kadar ben tam olarak emin değilim). Benzer şekilde, getPlaybackHeadPosition dosya sonunda oynatma devam eder ve art arda durur. Biri yardım edebilir mi?AudioTrack nesnesi ne zaman bittiğini nasıl anlarsınız?

cevap

14

AudioTrack.setNotificationMarkerPosition (audioLength) ve audioTrack.setPlaybackPositionUpdateListener'ın benim için çalıştığını buldum.

// 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

Bu benim için çalışıyor:

  do{              // Montior playback to find when done 
       x = audioTrack.getPlaybackHeadPosition(); 
     }while (x< pcmFile.length()/2); 
aşağıdaki kodu Bkz
İlgili konular