我正在尝试使以下基本python脚本在我的Raspberry Pi上运行:
"""PyAudio Example: Play a wave file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
# instantiate PyAudio (1)
p = pyaudio.PyAudio()
# open stream (2)
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
# read data
data = wf.readframes(CHUNK)
# play stream (3)
while len(data) > 0:
stream.write(data)
data = wf.readframes(CHUNK)
# stop stream (4)
stream.stop_stream()
stream.close()
# close PyAudio (5)
p.terminate()
当然,这是基本的PyAudio示例脚本。大多数情况下,它运行良好。但是,如果在此过程中存在任何滞后,stream.write(data)
将无限期挂起(即永不返回)。这是通过向time.sleep()
添加调用来模拟的,从而使代码的第3部分变为:
# play stream (3)
while len(data) > 0:
stream.write(data)
data = wf.readframes(CHUNK)
time.sleep(0.1)
我还尝试在笔记本电脑上运行此修改后的代码,它产生了乱码,但至少没有无限期地挂起。它还引发了ALSA lib pcm.c:7963:(snd_pcm_recover) underrun occurred
警告,但这是预料之中的,并且代码继续运行。
我很困惑为什么会这样。我浏览了PyAudio的源代码,似乎stream.write()
引用了PortAudio的Pa_WriteStream()
。根据那些docs,此功能将一直阻塞,直到OS从缓冲区读取数据为止。因此,我想知道Raspbian是否存在问题?我正在使用USB音频适配器。
任何帮助将不胜感激。谢谢!