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