Java Can';t暂停后恢复音频曲目

Java Can';t暂停后恢复音频曲目,java,android,Java,Android,我目前正在流模式下使用AudioTrack播放一些预先录制的曲目。播放和停止机制正常工作。但是,当我点击暂停并尝试在之后恢复时,缓冲区仅读取-1,表示已达到EOF 我试图标记并重置Inputstream,就像一些帖子中建议的那样,但没有任何帮助 public void pauseTrack() { currentAudioTrack.pause(); isPaused = true; } public void resumeTrack() { isPaused = false; }

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

我试图标记并重置Inputstream,就像一些帖子中建议的那样,但没有任何帮助

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());
  }
}
public void pauseTrack(){
currentAudioTrack.pause();
isPaused=真;
}
公共轨道(){
isPaused=false;
}
@重写公共无效运行(){
试一试{
while(偏移量
我做错了什么?

试试这个

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());
  }
}
public void pauseTrack()
{
currentAudioTrack.pause();
isPaused=真;
}
公共轨道()
{
isPaused=false;
}
@重写公共无效运行()
{
试一试{
while(偏移量
为了结束这篇文章,我最终改为AudioTrack静态模式。改变不是因为暂停的情况,但是它最终解决了这个问题。由于缓冲区写入是一次完成的,因此它不存在流模式的挑战

我使用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;   
}
请在运行前根据您的需要调整上述代码


谢谢

结果是一样的。我的方法是在音轨暂停时停止写作,并在音轨恢复时继续写作。但是,fileInputStream读取的是-1,就好像文件已到达其结尾一样。您是否尝试过InputStream的skip方法?有了它,您可以跳到
numberOfBytesRead
的位置,尽管skip方法正确地转发输入流,但audiotrack不会播放任何声音。