AudioTrack WRITE_BLOCKING 对比 WRITE_NON_BLOCKING

AudioTrack WRITE_BLOCKING vs WRITE_NON_BLOCKING

我想弄清楚 Android AudioTrack 的工作原理。我的一个困惑点是写入模式。

documentation for the write() method indicates that you can pass either a write mode 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() 确实阻塞了任何时间长度,一旦它 returns,您就可以合理地确定内部缓冲区已被最大程度地填充。在没有任何进一步 write()s 的情况下,AudioTrack 将继续为混音器提供音频输出,直到内部缓冲区耗尽。

此设计(内部缓冲区)旨在帮助您避免缓冲区欠载。缓冲区越大,没有 write().

的时间就越长