我正在使用Python sounddevicePySoundFile以“困难的方式”播放音频,即使用非阻塞回调。 (向https://stackoverflow.com/users/500098/matthias和乘员打招呼-这些程序包易于使用,可以完成我需要的一切。)注意:使用sd.play()更加容易,但是我选择了此补丁是因为在我的最终版本中在回调方法中进行其他处理。

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

这是一个不起作用的回调示例:它播放整个声音文件,但在处理完最后一个缓冲区后不会停止。在回调中,我引发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)

最佳答案

h!如果您不对它们进行raise,则异常将无法很好地工作!!回调的正确代码是:

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/

10-14 19:05
查看更多