在输出模式下运行的典型PyAudio回调是:
def callback(ignored, frame_count, time_info, status):
buffer = <fill and return a buffer with frame_count samples of data>
return (buffer, pyaudio.paContinue)
我还没有尝试过,但我很确定如果我在回调之后立即开始修改buffer
它会在播放时破坏数据 - 是真的吗?
所以问题:有没有办法知道PyAudio何时播放缓冲区?如果是这样,我想创建一个缓冲池,这样我就可以在PyAudio完成后重用缓冲区。
(如果没有找到PyAudio完成缓冲区的机制,我看到的唯一选择是在每次回调时分配一个新的缓冲区。也许这不是一个大问题。)
答案 0 :(得分:0)
由于回调在不同的线程中运行,从主线程访问buffer
基本上是不安全的,并且在回调结束时你无法立即知道 (至少没有阻止回调,你应该尽量避免)。但是,您可以循环浏览缓冲区列表,只要它们的总长度超过系统延迟,您应该合理地安全...
在这种情况下通常采用的是使用无锁环形缓冲区来传输和传出回调音频数据。遗憾的是,PortAudio的ringbuffer实现不是他们的共享库和AFAIK的一部分,它在PyAudio中也不可用(也不在sounddevice
模块中)。
无论如何,Python并不是真正做到实时音频的最佳环境,所以你必须忍受一些限制而且你永远不会真正拥有可靠的性能和非常低的延迟。