1

我正在使用Python sounddevicePySoundFile以“硬方式”播放音频,即使用非阻塞回调。(向https://stackoverflow.com/users/500098/matthias和工作人员致敬——这些软件包易于使用,可以满足我的所有需求。)注意:使用 sd.play() 更容易,但我'之所以选择这个 patk,是因为在我的最终版本中,我想在回调方法中进行额外的处理。

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

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

1 回答 1

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()

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

于 2016-05-02T18:16:56.750 回答