Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何正确暂停音轨并顺利恢复播放?_Android_Audio_Audiotrack - Fatal编程技术网

Android 如何正确暂停音轨并顺利恢复播放?

Android 如何正确暂停音轨并顺利恢复播放?,android,audio,audiotrack,Android,Audio,Audiotrack,我正在使用Android的AudioTrack播放先前录制的PCM文件。如果我玩的时候不停下来,一切都很好;但如果我暂停并继续,一大块大约1秒的音频就会被跳过。这是我的密码: // Player thread audioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, RECORDER_SAMPLERATE, AudioFor

我正在使用Android的AudioTrack播放先前录制的PCM文件。如果我玩的时候不停下来,一切都很好;但如果我暂停并继续,一大块大约1秒的音频就会被跳过。这是我的密码:

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