Getargs格式不是运行带有实时输入的PyAudio的元组

时间:2018-08-13 19:31:50

标签: python signal-processing pyaudio

我正在尝试使用PyAudio处理来自麦克风的实时数据。我遵循了PyAudio Documentationthis blog post上的示例。当我使用没有回调的stream.is_active()时,我没有任何错误,并且一切正常,但是如果使用回调,则会出现以下“ SystemError:新样式的getargs格式,但参数不是元组”

我已经看过问题Where is the error? “SystemError: new style getargs format but argument is not a tuple”,但这并不能解决我的问题。我将在代码下面解释我尝试过的事情:

FORMAT = pyaudio.paInt32
CHANNELS = 2
RATE = 44100
CHUNK = 1024  

def callback(in_data, frame_count, time_info, flag):
    print('Hi')

audio = pyaudio.PyAudio()

# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
                rate=RATE, input=True,
                frames_per_buffer=CHUNK,stream_callback = callback)

stream.start_stream()   

while stream.is_active():
    time.sleep(0.1)
    print('1')
stream.stop_stream()
stream.close()
audio.terminate()

我已确定该错误是我添加stream_callback = callback时所为。如果删除它,则不会出现错误。当我仅包含上面的语句时,回调中的确切代码似乎并不会影响该错误(尽管我的整个代码计算了两个通道之间的时间延迟)。我的回调参数直接从文档中定义。我不太确定该尝试什么,因为我没有直接在回调中做任何事情。

2 个答案:

答案 0 :(得分:2)

the example you linked说:

  

在回调模式下,只要需要新的音频数据(播放)和/或有新的(记录的)音频数据可用,PyAudio就会调用指定的回调函数(2)。请注意,PyAudio在单独的线程中调用回调函数。该函数具有以下签名callback(<input_data>, <frame_count>, <time_info>, <status_flag>),并且必须返回一个包含frame_count音频数据帧的元组和一个标志,该标志表示是否有更多帧要播放/记录。

但是您的回调函数无法做到这一点:

def callback(in_data, frame_count, time_info, flag):
    print('Hi')

这根本没有return语句,因此它只返回None

将其与引用的示例进行比较,该示例返回一个缓冲区和一个标志。那就是你需要做的。

得到特定错误而不是更容易理解的原因是,在幕后某个地方,PyAudio通过使用采用Python元组的C API函数来解析您的返回值,而无需执行任何操作显式错误处理。这样做不理想,因为当您不知道错误消息的含义时,错误消息很难阅读……

答案 1 :(得分:0)

我遇到了同样的问题。我通过添加解决了

return None, pyaudio.paContinue

到回调函数结束。