我使用Python sounddevice和PySoundFile播放音频"艰难的方式",即使用非阻塞回调。 (对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)
答案 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()
...它运作得非常完美,一直播放到最后,并在播放完最后一个缓冲区后停止。