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

时间:2016-05-02 18:14:05

标签: python audio python-sounddevice

我使用Python sounddevicePySoundFile播放音频"艰难的方式",即使用非阻塞回调。 (对https://stackoverflow.com/users/500098/matthias和工作人员的提示 - 这些包很容易使用,并且做我需要的一切。)注意:使用sd.play()要容易得多,但是我选择了这个patk,因为在我的最终版本中,我想在回调方法中进行额外的处理。

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

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

1 个答案:

答案 0 :(得分:1)

卫生署!如果你不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()

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