我正在尝试弄清楚 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/