Ryberry Pi上的PyAudio / PortAudio冻结

时间:2018-09-28 04:30:17

标签: python-2.7 raspberry-pi3 pyaudio portaudio

我正在尝试使以下基本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音频适配器。

任何帮助将不胜感激。谢谢!

0 个答案:

没有答案