android - 如何正确暂停AudioTrack并恢复平稳播放?

标签 android audio audiotrack

我正在使用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();

这是暂停和继续播放的代码:
public void pause(){
    this.paused = true;
    audioTrack.pause();
}

public void resume(){
    this.paused = false;
}

怎么了?做pause的正确方法是什么?

最佳答案

很有可能write返回的传输计数很短。根据documentation

...if the track is stopped or paused on entry... then the write may return a short transfer count.



您的代码无法解决这种情况,因此很可能只是丢弃了整个缓冲区的音频。

一个简单的解决方案可能是在write之后立即尝试第二个play(),但是仅在第一个write返回短计数的情况下。第二个write将需要准确说明第一个write期间未写入的字节。

关于android - 如何正确暂停AudioTrack并恢复平稳播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57921972/

相关文章:

android - 音频播放失败 - E/android.media.AudioTrack:多声道配置中必须存在前置声道

android - 是否可以生成小于 1 秒长的音调/音频?还是立即切断播放器?

android - 如何增加放大 AudioTrack?

android - ISO15693/Tag-it HF-I 收发失败

android - 轮换 Activity 时如何不破坏ViewModel

具有指定提示的 Android 搜索栏

android - 此模板要求构建目标 API 版本至少为 14,当前版本为 8

cocoa - 使用 NSSpeechRecognizer 或带有音频文件的替代方案而不是麦克风输入?

c++ - 如何根据不同的扬声器分离音频文件

python - 在Windows上的Python 2.7中将标签应用于WAV文件