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()
.
的时间就越长
我想弄清楚 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()
.