提前输入stream.write()

问题描述 投票:0回答:1

我正在将我为 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 pyaudio
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.