首页 > 解决方案 > 如何等待异步 AudioTrack.write 完成?

问题描述

我想播放以 1/50 秒为增量合成的音频。用异步流接口AudioTrack我的计划是基本做到以下几点:

while (!done)
{
  frame = synthesize();
  audio.waitForWrite(); // XXX
  audio.write(frame, 0, frameSize, WRITE_NON_BLOCKING);
}
audio.waitForWrite(); // XXX

但是,我可以在这里使用没有waitForWrite或类似的方法;AudioTrack如果我只是进行非阻塞写入,第二帧将在中间替换第一帧,即假设合成 20ms 帧需要 5ms,那么第一帧将播放 5ms 然后被第二帧替换一个在 5ms 之后,依此类推,这显然不是我想要的。

另一方面,如果我使用阻塞写入,那么当前一帧已经在播放时,我无法合成下一帧。

标签: androidasynchronousaudiotrack

解决方案


您误解了流媒体模式。写入不会花费播放它所需的时间。写入将其复制到另一个缓冲区。在阻塞模式下,它将等到整个缓冲区被复制,但直到它被播放。在非阻塞模式下,它将立即复制并立即返回。无需等待它以任何一种模式播放,也没有理由等待。


推荐阅读