我正在将我为 Android 编写的节拍器翻译成适用于经典桌面计算机的 Python。
在 Android 下,缓冲区的长度为 2 秒,并且始终被填满,这意味着它是防 2 秒滞后的。 使用 Python 和 Pyaudio,我正在做类似的事情(带有 4 个节拍的小节):
bar = 0
while self.isRunning:
stream.write(beat[bar])
print("beat {} was read".format(bar)
bar += 1
bar %= 4
请参阅:
*sound of beat[0] is played*
beat 0 was read
*sound of beat[1] is played*
beat 1 was read
...
PyAudio 正在等待缓冲区变空,然后再恢复。我理解的“阻塞”方式。
相反,我希望看到(如在 Android 中)
*sound of beat[0] is played*
beat 0 was read
beat 1 was read
beat 2 was read
*sound of beat[1] is played*
beat 3 was read
*sound of beat[2] is played*
beat 3 was read
BPM 为 120 意味着流始终有 2 秒的缓冲区可供读取。
我的问题:是否有任何东西可以在读取的同时向缓冲区提供数据? 当我在蹩脚的硬件主机上的虚拟机中尝试节拍器时,第一个节拍滞后,这让我担心......
我不确定回调方法是否允许这样做,因为我需要根据我在结构中的位置(我的节拍器处理复杂的结构)和条来播放特定的声音,所以实现起来会很痛苦。
可以使用Python线程(来自threading模块)来做到这一点,但仅使用回调API(它将为您创建一个单独的音频线程)更有意义。
您可以使用Queue来实现缓冲。
我刚刚为sounddevice 模块创建了一个 示例程序,它展示了如何完成此操作。