我的最终目标是同时输出一个wav文件并在麦克风上进行录制,并在情节上将两者相互叠加显示。这不需要低等待时间,但是它确实需要以正确表示实时情况的方式覆盖这两个图。如果我将麦克风线路连接到扬声器线路,则图表应相对对齐。
由于似乎存在一定程度的延迟,所以我的解决方案是使用回调提供的时间变量。这应该让我在进行绘图以针对延迟进行调整时适当地移动绘图。我收到了适合DAC时间和当前时间的值,但是ADC时间给了我0。
def callback(indata, outdata, frames, time, status):
print "ADC time: ", time.inputBufferAdcTime
print "DAC time: ", time.outputBufferDacTime
print "curr time: ", time.currentTime
print "time diff: ", time.outputBufferDacTime - time.currentTime
print "###############"
if status:
print(status)
if len(data[callback.index:]) < frames:
outdata[:len(data[callback.index:])] = data[callback.index:]
outdata[len(data[callback.index:]):] = np.zeros(
((len(outdata) - len(data[callback.index:])), len(args.channels)))
raise sd.CallbackStop
else:
outdata[:] = data[callback.index:callback.index + frames]
q_out.put(outdata[::args.downsample, mapping])
q_in.put(indata[::args.downsample, mapping])
callback.index += frames
答案 0 :(得分:0)
如果inputBufferAdcTime
给您0,则为PortAudio问题。这很可能取决于您使用的主机API,还可能取决于您的硬件和驱动程序。您应该在PortAudio邮件列表(http://portaudio.com/contacts.html)上询问是否要了解有关此的更多信息。
或者您可以尝试使用其他主机API,它可能会更好。
您也可以尝试查询流对象的latency属性,但是可能有相同的问题。
最后,如果您无法以这种方式获得正确的延迟,则可以自己衡量延迟。只需将电缆从声卡的输出连接到输入,播放一些测试信号并记录结果即可(就像您在代码示例中所做的一样)。您应该能够通过比较两个信号来找到等待时间值。