2010-09-04 27 views
12

Tôi đang cố gắng phát tệp PCM trong Android bằng cách sử dụng lớp AudioTrack. Tôi có thể nhận được tập tin để chơi tốt, nhưng tôi không thể tin tưởng một cách đáng tin cậy khi phát lại đã kết thúc. AudioTrack.getPlayState cho biết quá trình phát lại đã dừng khi chưa phát xong. Tôi gặp vấn đề tương tự với AudioTrack.setNotificationMarkerPosition và tôi chắc chắn rằng điểm đánh dấu của tôi được đặt ở cuối tệp (mặc dù tôi không hoàn toàn chắc chắn rằng mình đang làm đúng). Tương tự như vậy, phát lại tiếp tục khi getPlaybackHeadPosition nằm ở cuối tệp và đã dừng tăng dần. Có ai giúp được không?Làm cách nào để biết khi nào đối tượng AudioTrack đã phát xong?

Trả lời

14

Tôi nhận thấy rằng việc sử dụng audioTrack.setNotificationMarkerPosition (audioLength) và audioTrack.setPlaybackPositionUpdateListener đã hoạt động đối với tôi. Xem đoạn mã sau:

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

này làm việc cho tôi:

  do{              // Montior playback to find when done 
       x = audioTrack.getPlaybackHeadPosition(); 
     }while (x< pcmFile.length()/2); 
Các vấn đề liên quan