Я пытаюсь заставить следующий базовый скрипт на 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 кода становился таким:не висеть бесконечно.Он также выдал предупреждение ALSA lib pcm.c:7963:(snd_pcm_recover) underrun occurred
, но это было ожидаемо, и код продолжал выполняться.
Я не понимаю, почему это происходит.Я просмотрел исходный код PyAudio, и кажется, что stream.write()
содержит ссылку на Pa_WriteStream()
в PortAudio.Согласно этим документам эта функция блокируется до тех пор, пока ОС не прочитает данные из буфера.Поэтому мне интересно, если это проблема с Raspbian?Я использую аудиоадаптер USB.
Буду признателен за любую помощь.Спасибо!