PyAudio / PortAudio замораживание на Raspberry Pi - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь заставить следующий базовый скрипт на 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.

Буду признателен за любую помощь.Спасибо!

...