【问题标题】:How to tell when AudioTrack object has finished playing?如何判断 AudioTrack 对象何时播放完毕?
【发布时间】:2010-09-04 17:42:02
【问题描述】:

我正在尝试使用 AudioTrack 类在 Android 中播放 PCM 文件。我可以让文件正常播放,但我无法可靠地判断播放何时完成。 AudioTrack.getPlayState 表示播放未完成时已停止播放。我对AudioTrack.setNotificationMarkerPosition 有同样的问题,我很确定我的标记设置在文件的末尾(尽管我不完全确定我做对了)。同样,当getPlaybackHeadPosition 位于文件末尾并停止递增时,播放将继续。有人可以帮忙吗?

【问题讨论】:

    标签: java android audiotrack


    【解决方案1】:

    我发现使用 audioTrack.setNotificationMarkerPosition(audioLength) 和 audioTrack.setPlaybackPositionUpdateListener 对我有用。见以下代码:

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

    【讨论】:

    【解决方案2】:

    这对我有用:

                do{                                                     // Montior playback to find when done
                     x = audioTrack.getPlaybackHeadPosition(); 
            }while (x< pcmFile.length() / 2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 2012-07-27
      • 2012-03-09
      • 1970-01-01
      • 2017-06-23
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多