Python GStreamer:为音频引入延迟/间隙/移位

Python GStreamer:为音频引入延迟/间隙/移位,python,audio,synchronization,gstreamer,python-gstreamer,Python,Audio,Synchronization,Gstreamer,Python Gstreamer,我在gstreamer中设置了以下管道: 来自两个独立usb音频接口的两个脉冲音频源(pulsesrc)和一个脉冲音频接收器(pulsesink)。我正在使用加法器组件组合两个传入的音频流。不幸的是,两个音频通道之间有轻微延迟 pulsesrc1 --- queue --- audioconvert --- audioresample --- | | adder --- queu

我在gstreamer中设置了以下管道:

来自两个独立usb音频接口的两个脉冲音频源(pulsesrc)和一个脉冲音频接收器(pulsesink)。我正在使用加法器组件组合两个传入的音频流。不幸的是,两个音频通道之间有轻微延迟

pulsesrc1 --- queue --- audioconvert --- audioresample --- |
                                                           | adder --- queue --- | pulsesink
pulsesrc2 --- queue --- audioconvert --- audioresample --- |
我正在使用系统时间/时钟进行同步。两个音频接口都连接到同一个usb集线器。我猜音频在被信号源接收之前已经有了一点延迟(由于不同的时钟)

这就是为什么我想对第一个音频通道引入延迟/间隔/移位(第二个稍微滞后)来补偿这一点

到目前为止,我尝试设置第一个队列的属性“minthresholdtime”。不幸的是,管道补偿了这个延迟,两个音频流的延迟相等。我还检查了元素“audioecho”。不幸的是,它缺少“干/湿”属性。这意味着原始信号总是在其原始时间播放,然后延迟尾开始播放(这对我一点帮助都没有)

如何解决这个问题还有什么进一步的想法吗?也许会增加一个沉默的间隙?或者其他我可能遗漏的参数


我已经用Python实现了这个管道。提前谢谢你

您可以使用队列中的最小阈值时间/字节来延迟通过管道的其余部分发送数据吗?我认为应该行得通。只有在这不适用的情况下:


或者修改frie0r音频延迟插件。

谢谢av501!我以前尝试过设置最小阈值时间。不幸的是,这不起作用,因为GStreamer的自动延迟补偿会平衡其他音频路径中的延迟。我来看看shift插件。我会让你知道它是如何工作的。你曾经使用过移位元素吗?这个简单的测试管道不起作用-没有发生变化:gst-launch-0.10 pulsesrc设备=alsa_输入。usb-Creative_Technology_Ltd_Sound_Blaster_X-Fi_Go_Pro_0020613-00-Pro.analog-stereo!换档延迟=2000!队列pulsesink device=alsa_output.usb-Creative_Technology_Ltd_Sound_Blaster_X-Fi_Go_Pro_00201613-00-Pro.analog-Stereino本人从未使用过。也许一些调试打印可以告诉您发生了什么?GST_调试=3或4。顺便说一句,在简单的管道中,您如何知道发生了转移?我认为这不会发生。从我所读到的,它改变了时间戳。所以,如果您将它多路复用到一个容器中,您应该会看到移位的时间戳。但是,否则管道将不会启动,除非在接收器之前有一个输出(除非管道处于活动模式。如果接收器具有活动模式,请启用它)。查看调试日志(级别3-5)。没什么可疑的。这是否意味着,我实际上并没有延迟从输入到输出的音频,以便在特定时间(例如2秒)后播放?它只是改变了TimeTemp,而像VLC这样的播放器会获得时间戳并相应地延迟音频?我也尝试过对数据进行多路复用,但是延迟2000000微秒的移位元素对多路复用文件没有任何影响(就实际延迟而言)。现在我要看一下实际的时间戳(必须先找到一个工具)。好的,我联系了Shift元素的开发人员。它实际上只是更改时间戳,并没有延迟源输出处的信号。他很友好地添加了这个特性(已经提交给GitHub)。现在可以设置延迟信号的属性“running time=TRUE”。这适用于简单的管道,如“inputsrc!shift!outputsrc”,但在尝试将移位的音频流定向到多路复用器时失败。我想我必须回到你最初的建议,写我自己的gstreamer插件。无论如何,再次感谢你的帮助!