我正在使用Python sounddevice和PySoundFile以“硬方式”播放音频,即使用非阻塞回调。(向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)