java - AudioTrack WRITE_BLOCKING 与 WRITE_NON_BLOCKING

标签 java android audio signal-processing audiotrack

我正在尝试弄清楚 Android AudioTrack 的工作原理。让我困惑的一点是写入模式。

documentation for the write() method表示您可以通过写入模式 WRITE_BLOCKING or WRITE_NON_BLOCKING .

根据描述,WRITE_BLOCKING 是否会阻塞直到所有数据都已播放?例如,如果我有一个大小为 2048 个样本、大小为 44100 的单声道音频缓冲区,则使用 WRITE_BLOCKING 调用 write 将阻塞 2048 * (1000.0/44100) 毫秒?这是否意味着一旦写入完成,您就会立即陷入缓冲区不足的情况?

最佳答案

正如 @Michael 提到的,它会阻塞,直到数据排队为止。这与WRITE_BLOCKING的描述中的含义相同;它会阻塞,直到数据写入到内部缓冲区(您在构造期间为其指定大小的缓冲区)。

如果缓冲区已满(数据尚未播放),

write( ..., 2048, WRITE_BLOCKING ) 将阻塞大约 2048 * (1000.0/44100) 秒。如果 write() 确实阻塞了任意时间,一旦它返回,您就可以合理地确定内部缓冲区已最大程度地填充。如果没有任何进一步的 write()s,AudioTrack 将继续为混音器提供音频输出,直到内部缓冲区耗尽。

这种设计(内部缓冲区)应该可以帮助您避免缓冲区欠载。缓冲区越大,无需 write() 的时间就越长。

关于java - AudioTrack WRITE_BLOCKING 与 WRITE_NON_BLOCKING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830378/

相关文章:

java - 如何忽略 JAX-RS 2.0 客户端中的意外字段?

java - 根据变量值执行不同的类

java - 在 android 数组适配器中使用 notifyDataSetChanged 时出错

android - 播放自定义音频格式

android - ququer背后的技术是什么?

java - 如何在谷歌地图上设置可预测搜索?

android - Google Play/App Store 应用内购买政策

bash - 如何使用 ffmpeg 工作获取 bash 脚本以将 mp3 转换为 wav?

audio - 使用新创建的声音字体播放 MIDI 时,在 channel 9 上找不到预设

android - 从 HttpResponse 中提取消息正文