Pyaudio:将输入连接到输出时出现错误

3
我正在Intel Edison板上尝试使用pyaudio,但是它在内置测试中失败了。单独录制和播放可以正常工作,但是如果我尝试将输入连接到输出,则会出现错误。
以下是pyaudio中将输入连接到输出的示例代码:

文件"wire_full.py",第33行, data = stream.read(CHUNK) 文件"/usr/lib/python2.7/site-packages/pyaudio.py",第605行, return pa.read_stream(self._stream, num_frames) IOError: [Errno Input overflowed] -9981

有人能理解这是什么问题吗?
""" 
PyAudio Example: Make a wire between input and output (i.e., record a 
few samples and play them back immediately). 


This is the full duplex version. 
"""  


import pyaudio  
import sys  


CHUNK = 1024  
WIDTH = 2  
CHANNELS = 2  
RATE = 44100  
RECORD_SECONDS = 5  


if sys.platform == 'darwin':  
    CHANNELS = 1  


p = pyaudio.PyAudio()  


stream = p.open(format=p.get_format_from_width(WIDTH),  
                channels=CHANNELS,  
                rate=RATE,  
                input=True,  
                output=True,  
                frames_per_buffer=CHUNK)  


print("* recording")  


for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):  
    data = stream.read(CHUNK)  
    stream.write(data, CHUNK)  


print("* done")  


stream.stop_stream()  
stream.close()  

p.terminate()
2个回答

2
我通过将CHUNK大小更改为512来解决了这个问题。偶尔仍然会出现相同的错误,但大部分时间都可以正常工作。
如果有任何想法为什么这样可以,或者如何完全消除错误?
更新
好的,所以我用try..except包围了读/写代码,并将CHUNK大小降低到512,现在它可以正常工作而没有任何错误。如果我使用1024作为CHUNK大小,很多帧会丢失,声音质量也很差。
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):  
    try:
        data = stream.read(CHUNK)  
        stream.write(data, CHUNK)  
    except:
        pass

感谢 @Meta 提供的线索!:)

1
请看我在https://dev59.com/b2gv5IYBdhLWcg3wQ-kV#28574532的回答。简而言之,输入溢出消息意味着您没有足够快地读取流,即音频数据的缓冲区被新的传入数据覆盖,而您没有时间读取它。我认为在这种情况下,pyaudio不应该抛出异常,因为这可能是可以接受的。此外,因为它会抛出错误,所以您将失去该调用的所有数据。请参见上面链接中的补丁,以了解更改其行为的临时方法。 - Meta

0
这段代码记录音频并立即播放它:
import pyaudio
import time
import pickle

WIDTH = 2
CHANNELS = 2
RATE = 44100

p = pyaudio.PyAudio()

def callback(in_data, frame_count, time_info, status):
    return (in_data, pyaudio.paContinue)

stream = p.open(format=p.get_format_from_width(WIDTH),
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                stream_callback=callback)

stream.start_stream()

while stream.is_active():    
    time.sleep(0.1)

stream.stop_stream()
stream.close()

p.terminate()

当我运行你的代码时,我得到了以下信息:python: src/hostapi/alsa/pa_linux_alsa.c:3636: PaAlsaStreamComponent_BeginPolling: Assertion `ret == self->nfds' failed. - user1759557
在此处查看后者的解决方案:stackoverflow.com/a/60824906/1509695。这是PortAudio的补丁,我认为PyAudio正在使用它。 - matanster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接