Python Sounddevice回调时间.inputBufferAdcTime返回0

时间:2018-09-11 19:41:59

标签: python python-2.7 python-sounddevice

我的最终目标是同时输出一个wav文件并在麦克风上进行录制,并在情节上将两者相互叠加显示。这不需要低等待时间,但是它确实需要以正确表示实时情况的方式覆盖这两个图。如果我将麦克风线路连接到扬声器线路,则图表应相对对齐。

output on top of input plot

由于似乎存在一定程度的延迟,所以我的解决方案是使用回调提供的时间变量。这应该让我在进行绘图以针对延迟进行调整时适当地移动绘图。我收到了适合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

1 个答案:

答案 0 :(得分:0)

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

或者您可以尝试使用其他主机API,它可能会更好。

您也可以尝试查询流对象的latency属性,但是可能有相同的问题。

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

相关问题