我正在将我为Android编写的节拍器翻译成经典桌面机器的Python。
在Android下,缓冲区长2秒,并且总是填充,这意味着它是2s-lag-proof。 使用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秒缓冲区可供读取。
我的问题:是否可以在读取的同时提供缓冲区? 当我在蹩脚的硬件主机上尝试使用虚拟机中的节拍器时,第一次节拍就会让我担心......
我不确定回调方法是否允许这样做,因为我需要根据我在结构中的位置(我的节拍器处理复杂结构)和条形式播放特定的声音,实现起来会很痛苦。
答案 0 :(得分:0)
你可以使用Python线程(来自threading模块)来做到这一点,但是使用回调API(它会为你创建一个单独的音频线程)更有意义)。
您可以使用Queue实现缓冲。
我刚刚为example program模块创建了一个sounddevice,其中显示了如何完成此操作。