Rust 在GStreamer管道中将T形三通的单个分支延迟n秒

Rust 在GStreamer管道中将T形三通的单个分支延迟n秒,rust,gstreamer,Rust,Gstreamer,假设管道如下所示: videotestsrc +-> timeoverlay +-> tee +-> queue +-> autovideosink | +-> queue +-> autovideosink tee的第一个分支必须充当直通,只需让样本流到管道的其余部分。第二个分支必须非常相似,唯一的区别是它相对

假设管道如下所示:

videotestsrc +-> timeoverlay +-> tee +-> queue +-> autovideosink
                                     |
                                     +-> queue +-> autovideosink
tee
的第一个分支必须充当直通,只需让样本流到管道的其余部分。第二个分支必须非常相似,唯一的区别是它相对于第一个分支应有n秒的延迟

不幸的是,我自己还没能做到这一点

我已尝试设置第二个分支的
队列的
最大大小-*
最小阈值时间
属性(如回答中建议的那样),但没有起作用

我还试图通过
queue.get\u sink\u pads().first().unwrap().set\u offset(-5000000000)
修改第二个分支的运行时间,但遗憾的是,它也不起作用

我还尝试连接一个焊盘探针,并重新将通过第二个分支的
队列
的接收器焊盘的缓冲区夯实为n秒,希望它们能保留在
队列
上,直到管道的运行时间赶上,但它也不起作用(我认为它不起作用,因为即使
tee
元素创建单独的分支,缓冲区仍然通过引用共享)

我在下面附上了一段代码片段,显示了我所取得的进展(老实说,这并不多)

不必从头实现插件就可以实现这种行为吗


为了尝试并实现这种行为,我首先实例化了基本元素

让videotestsrc=ElementFactory::make(“videotestsrc”,无)?;
让timeoverlay=ElementFactory::make(“timeoverlay”,无)?;
让T=ElementFactory::make(“T”,无)?;
…然后我实例化了管道

let pipeline=pipeline::new(无);
管道。添加(&videotestsrc)?;
管道。添加(&timeoverlay)?;
管道。添加(&T)?;
…然后我创建了分支

{
让queue=ElementFactory::make(“queue”,None)?;
让autovideosink=ElementFactory::make(“autovideosink”,无)?;
管道。添加(&队列)?;
管道。添加(&autovideosink)?;
三通连接(和队列)?;
queue.link(&autovideosink)?;
}
{
让queue=ElementFactory::make(“queue”,None)?;
让autovideosink=ElementFactory::make(“autovideosink”,无)?;
//queue.set_property_from_str(“泄漏”、“下游”);
//queue.set_属性(“最大大小缓冲区”、&0u32)?;
//queue.set_属性(“最大大小字节”、&0u32)?;
//queue.set_属性(“最大大小时间”、&0u64)?;
//queue.set_属性(“最小阈值时间”&5000000000u64)?;
管道。添加(&队列)?;
管道。添加(&autovideosink)?;
三通连接(和队列)?;
queue.link(&autovideosink)?;
}
关于第二个分支的评论来自我的一次尝试,但没有成功

我还试图通过queue.get_sink_pads().first().unwrap().set_offset(-5000000000)修改第二个分支的运行时间,但遗憾的是,它也不起作用


这几乎就是解决方案:设置一个正值,它应该会起作用。您当前正在将其移到过去。此外,请确保a)在队列的源极板上设置偏移量,b)队列至少可以容纳与您设置的偏移量相同的数据。

我刚刚测试了这一点,它工作正常。我开始记不清到目前为止你救了我多少次了。非常非常感谢。