【问题标题】:Can't resume AudioTrack after pause暂停后无法恢复 AudioTrack
【发布时间】:2017-05-15 22:48:07
【问题描述】:

我目前在流模式下使用 AudioTrack 来播放一些预先录制的曲目。播放和停止机制正常工作。但是,当我点击暂停并尝试恢复之后,缓冲区仅读取 -1,表示已达到 EOF。

我尝试标记和重置输入流,就像某些帖子中建议的那样,但没有帮助。

public void pauseTrack() {
  currentAudioTrack.pause();
  isPaused = true;
}

public void resumeTrack() {
  isPaused = false;
}

@Override public void run() {
  try {
    while (offset < audioFile.length()) {
      if (isPaused)
        continue;
      currentAudioTrack.play();
      int numberOfBytesRead = fileInputStream.read(audioData);
      if (numberOfBytesRead != -1) {
        currentAudioTrack.write(audioData, 0, numberOfBytesRead);
        offset+=numberOfBytesRead;
      }
      else {
        return;
      }
    }
    Log.v("status", "finished reading");
  } catch (IOException io) {
    Log.v("Exception", "IOException found: " + io.getLocalizedMessage());
  } catch (IllegalStateException ie) {
    Log.v("Exception","IllegalStateException:" + ie.getLocalizedMessage());
  }
}

我做错了什么?

【问题讨论】:

标签: java android


【解决方案1】:

为了结束这篇文章,我最终更改为 AudioTrack 静态模式。更改不是因为暂停情况,但最终解决了它。由于缓冲区写入是一次性完成的,因此不会出现流模式的挑战。

【讨论】:

    【解决方案2】:

    试试这个

    public void pauseTrack()
    {
      currentAudioTrack.pause();
      isPaused = true;
    }
    
    public void resumeTrack() 
    {
      isPaused = false;
    }
    
    @Override public void run() 
    {
      try {
            while (offset < audioFile.length()) 
            {
              if(isPaused != true)
              {
                  currentAudioTrack.play();
                  int numberOfBytesRead = fileInputStream.read(audioData);
                  if (numberOfBytesRead != -1) {
                    currentAudioTrack.write(audioData, 0, numberOfBytesRead);
                    offset+=numberOfBytesRead;
                  }
                  else {
                    return;
                  }
              }
    
            }
        Log.v("status", "finished reading");
      } catch (IOException io) {
        Log.v("Exception", "IOException found: " + io.getLocalizedMessage());
      } catch (IllegalStateException ie) {
        Log.v("Exception","IllegalStateException:" + ie.getLocalizedMessage());
      }
    }
    

    【讨论】:

    • 结果是一样的。我的方法是在曲目暂停时停止写入,并在曲目恢复时恢复。但是,fileInputStream 读取 -1,就好像文件到达了结尾一样。
    【解决方案3】:

    我使用下面的skip()方法跳过触发暂停时记录的偏移量。到目前为止工作正常。

    
    public void play() {
    try {
    
         dis.skip(offset);  //skip "offset * bufferSize" in the **dis** data input stream 
    
         while (((i = dis.read(music_chunk, 0 , 0)) > -1) && !isPaused) {
               i = dis.read(music_chunk, 0, bufferSize);
               track.write(music_chunk, 0, i);   // track is the AudioTrack
               position += bufferSize;
         }
         track.stop();
    }
    
    public void pause() {   
          track.pause();
          offset      = position ;
          isPaused    = true;   
    }
    

    请在运行前根据您的需要调整上述代码。

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多