gpt4 book ai didi

python - 如何从回调中优雅地停止 python sounddevice

转载 作者:太空宇宙 更新时间:2023-11-03 16:39:01 27 4
gpt4 key购买 nike

我正在使用Python sounddevicePySoundFile以“困难的方式”播放音频,即使用非阻塞回调。 (向https://stackoverflow.com/users/500098/matthias和工作人员致敬——这些包很容易使用,可以完成我需要的一切。)注意:使用 sd.play() 更容易,但我选择了这个 patk,因为在我的最终版本中我想在回调方法中进行额外的处理。

我可以检测何时到达声音文件的末尾,但不清楚如何告诉声音设备在播放最后一个排队的缓冲区后停止。

这是一个不起作用的回调示例:它播放整个声音文件,但在处理最后一个缓冲区后不会停止。在回调中,我引发 sd.CallbackStop(),但流状态永远不会变为 stopped:

    def callback(outdata, frame_count, time, status):
view = sf.read(frame_count, dtype='float32', out=outdata)
if (view.size != outdata.size): # this was the last buffer.
print('stopping')
sd.CallbackStop()

with sd.OutpuStream(samplerate=sf.samplerate,
channels=sf.channels,
dtype=np.float32,
callback=callback) as ss:
while (ss.active):
time.sleep(0.1)

最佳答案

哦!如果您不引发异常,那么它们就不能很好地工作!回调的正确代码是:

def callback(outdata, frame_count, time, status):
view = sf.read(frame_count, dtype='float32', out=outdata)
if (view.size != outdata.size): # this was the last buffer.
# zero the part of outdata not written into by sf.read()
outdata[view.shape[0]:,:].fill(0.0)
print('stopping')
raise sd.CallbackStop()

...它工作得非常完美,一直播放到最后并在播放完最后一个缓冲区后停止。

关于python - 如何从回调中优雅地停止 python sounddevice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988920/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com