提前输入stream.write()

时间:2016-11-11 18:29:17

标签: python pyaudio

我正在将我为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秒缓冲区可供读取。

我的问题:是否可以在读取的同时提供缓冲区? 当我在蹩脚的硬件主机上尝试使用虚拟机中的节拍器时,第一次节拍就会让我担心......

我不确定回调方法是否允许这样做,因为我需要根据我在结构中的位置(我的节拍器处理复杂结构)和条形式播放特定的声音,实现起来会很痛苦。

1 个答案:

答案 0 :(得分:0)

可以使用Python线程(来自threading模块)来做到这一点,但是使用回调API(它会为你创建一个单独的音频线程)更有意义)。

您可以使用Queue实现缓冲。

我刚刚为example program模块创建了一个sounddevice,其中显示了如何完成此操作。