Android 如何正确暂停音轨并顺利恢复播放?
我正在使用Android的AudioTrack播放先前录制的PCM文件。如果我玩的时候不停下来,一切都很好;但如果我暂停并继续,一大块大约1秒的音频就会被跳过。这是我的密码:Android 如何正确暂停音轨并顺利恢复播放?,android,audio,audiotrack,Android,Audio,Audiotrack,我正在使用Android的AudioTrack播放先前录制的PCM文件。如果我玩的时候不停下来,一切都很好;但如果我暂停并继续,一大块大约1秒的音频就会被跳过。这是我的密码: // Player thread audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, RECORDER_SAMPLERATE, AudioFor
// Player thread
audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
RECORDER_SAMPLERATE,
AudioFormat.CHANNEL_OUT_MONO,
RECORDER_AUDIO_ENCODING,
bufferSize,
AudioTrack.MODE_STREAM);
audioTrack.play();
FileInputStream is = null;
try {
is = new FileInputStream(filePath);
} catch (FileNotFoundException e){
e.printStackTrace();
return;
}
byte[] buffer = new byte[bufferSize];
int offset = 0;
while (true) {
if(paused) { continue;}
int cnt = 0;
try {
cnt = is.read(buffer, 0, bufferSize);
} catch (IOException e){
e.printStackTrace();
}
if(cnt < 0) break;
audioTrack.write(buffer, 0, cnt);
audioTrack.play();
}
audioTrack.release();
出了什么问题?暂停的正确方法是什么?最有可能的情况是,write返回的传输计数很短。根据
…如果曲目在进入时停止或暂停。。。然后写操作可能会返回一个短的传输计数
您的代码没有处理这种边缘情况,因此很可能整个缓冲区的音频都被丢弃了
一个简单的解决方案可能是在播放后立即尝试第二次写入,但只有在第一次写入返回短计数的情况下。第二次写入需要精确地解释第一次写入期间未写入的字节。您是否调用audioTrack.play;在没有任何服务的主线程活动/片段类中?我建议在后台线程的服务类中包装音频曲目播放代码。然后,您可以在广播接收器的帮助下实现播放/暂停功能。
public void pause(){
this.paused = true;
audioTrack.pause();
}
public void resume(){
this.paused = false;
}