0

我的最终目标是同时输出一个 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
4

1 回答 1

0

如果inputBufferAdcTime给你 0,那是 PortAudio 问题。这很可能取决于您使用的主机 API,也可能取决于您的硬件和驱动程序。如果您想了解更多信息,您应该在 PortAudio 邮件列表 ( http://portaudio.com/contacts.html ) 上询问。

或者您可以尝试不同的主机 API,它可能会更好。

您也可以尝试查询流对象的延迟属性,但可能会出现同样的问题。

最后,如果您无法通过这种方式获得正确的延迟,您可以简单地自己测量延迟。只需将电缆从声卡的输出连接到输入,播放一些测试信号并记录结果(就像您在代码示例中所做的那样)。您应该能够通过比较两个信号找到延迟值。

于 2018-09-12T07:30:35.377 回答