android - 如何等待异步 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 之后,依此类推,这显然不是我想要的。
另一方面,如果我使用阻塞写入,那么当前一帧已经在播放时,我无法合成下一帧。
解决方案
您误解了流媒体模式。写入不会花费播放它所需的时间。写入将其复制到另一个缓冲区。在阻塞模式下,它将等到整个缓冲区被复制,但直到它被播放。在非阻塞模式下,它将立即复制并立即返回。无需等待它以任何一种模式播放,也没有理由等待。
推荐阅读
- unity3d - Unity 动画显示它正在播放,而根本没有播放
- c - 如何在 C 中拥有具有多种类型对象或函数的数组
- html - 制作html页面时无法访问我的照片
- python - 使用 RFC 解决泰坦尼克号(Kaggle)数据集,未知标签类型:“未知”
- javascript - 如何在弹出内容加载后运行 js 功能 - 单击按钮后?
- css - NavBar中的nav-item下拉菜单,有没有办法在使用btn-outline时让它显示边框?
- php - wp_query - 限制 od 帖子和页面的数量
- c# - 我在 PodioApi C# System.IO.FileNotFoundException 中遇到运行时错误
- html - Bootstrap-4 / 在 HTML 中的 Lightbox2 中排列图像顺序
- amazon-web-services - 为什么 API Gateway 试图将我的二进制数据编码为字典?