使用Python同时录制3个麦克风而不会出现输入溢出

使用Python同时录制3个麦克风而不会出现输入溢出,python,python-multiprocessing,audio-recording,pyaudio,python-sounddevice,Python,Python Multiprocessing,Audio Recording,Pyaudio,Python Sounddevice,我必须同时录制3个话筒,尽可能减少它们之间的延迟。这将允许我计算麦克风之间的声音大小,这样我就可以精确地确定声源的位置 但是,我不断收到PulseAudio抛出的输入溢出错误,这使得数据无法使用,因为麦克风捕获的块中的帧被丢弃 到目前为止,我试图通过改变区块大小来解决这个问题,甚至在某一点上将其设置为我的速率的2倍。最初我使用的是,但当前版本的代码运行 为了同时开始所有三个录制,我一直在使用多处理,每个进程都包含自己的输入流,但即使在一个进程中运行所有3个流也会导致溢出 我也尝试过在有回调或没有

我必须同时录制3个话筒,尽可能减少它们之间的延迟。这将允许我计算麦克风之间的声音大小,这样我就可以精确地确定声源的位置

但是,我不断收到PulseAudio抛出的输入溢出错误,这使得数据无法使用,因为麦克风捕获的块中的帧被丢弃

到目前为止,我试图通过改变区块大小来解决这个问题,甚至在某一点上将其设置为我的速率的2倍。最初我使用的是,但当前版本的代码运行

为了同时开始所有三个录制,我一直在使用多处理,每个进程都包含自己的输入流,但即使在一个进程中运行所有3个流也会导致溢出

我也尝试过在有回调或没有回调的情况下运行流,但这没有什么区别。与将数据写入内存或直接写入磁盘相同

CHUNK=48000*2#CHUNK大小从5到96000不等,两者都不起作用
费率=48000
通道=1
文件名='recording'
def记录器(开始、麦克风编号、文件名):
运行=错误
q=队列()
file=sf.SoundFile(f./recordings/{file_name}{mic_num}.wav',mode='w',samplerate=RATE,channels=channels)
打印(“已创建”,麦克风数量)
def mic_处理器(数据、帧、时间、状态):
如果(状态):
#RIP录制:/
打印(状态)#唯一抛出的状态是输入溢出
全球运行
运行=错误
sys.exit()
q、 put(数据)
不运行时:
如果(datetime.datetime.now()>=start):
stream=sd.InputStream(samplerate=RATE,blocksize=CHUNK,device=mic\u num,channels=channels,callback=mic\u处理器)
stream.start()
打印('麦克风',麦克风编号,'录音')
运行=真
运行时:
尝试:
file.write(q.get())
除键盘中断外:
stream.stop()
file.flush()文件
file.close()文件
运行=错误
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
start=datetime.timedelta(秒=5)+datetime.datetime.now()
p1=进程(目标=记录器,参数=(开始,2,文件名))
p2=进程(目标=记录器,参数=(开始,3,文件名))
p3=进程(目标=记录器,参数=(开始,4,文件名))
p1.开始()
p2.start()
p3.开始()
尽管如此:
尝试:
睡眠时间(0.0001)
如果不是p1,则p1是否为活动状态(),p2是否为活动状态(),p3是否为活动状态():
print('某个进程出错,必须退出:/')
p1.终止()
p2.终止()
p3.终止()
sys.exit()
除键盘中断外:
打印('写入文件')
睡眠时间(0.5)
当p1.is_alive()或p2.is_alive()或p3.is_alive()时:
睡眠时间(0.1)
打破
理想情况下,我希望不再有输入溢出,但在这一点上,我完全不知道如何防止它们。我是不是应该换成阿尔萨而不是PulseAudio


我非常感谢您能为我提供的任何帮助:)

您能就您的设备
2
3
4
说几句话吗?它们是否同步?麦克风2、3和4是USB麦克风,使用系统时间同步。我在未来5秒生成一个datetime,将其传递给每个进程,一旦进程意识到给定的时间是现在,它就开始录制。我已经设法使录制开始的同步非常紧密。所以它们是独立的设备,彼此之间没有物理连接?看起来你永远也不会知道他们之间的确切延迟,对吧?将设备与自定义的
.asoundrc
组合时,问题可能会少一些,但它可能仍然不能很好地工作。除了设备之间存在未知的延迟外,您可能还会遇到时钟漂移,请参见或。设备之间的延迟并不是我目前的主要问题。如果我甚至不能让代码记录输入超过1秒而不抛出错误,那么消除延迟就不会有多大帮助。现在这可能不是你的问题,但可能是以后,在尝试计算时差时。我只是想说,调试一个可能最终失败的安装程序可能是浪费时间。