我正在尝试使用PyAudio处理来自麦克风的实时数据。我遵循了PyAudio Documentation和this 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
时所为。如果删除它,则不会出现错误。当我仅包含上面的语句时,回调中的确切代码似乎并不会影响该错误(尽管我的整个代码计算了两个通道之间的时间延迟)。我的回调参数直接从文档中定义。我不太确定该尝试什么,因为我没有直接在回调中做任何事情。
答案 0 :(得分:2)
在回调模式下,只要需要新的音频数据(播放)和/或有新的(记录的)音频数据可用,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
到回调函数结束。