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

Delaying a single branch of a tee by n seconds in a GStreamer pipeline

假设管道如下所示:

videotestsrc +-> timeoverlay +-> tee +-> queue +-> autovideosink
                                     |
                                     +-> queue +-> autovideosink

tee 的第一个分支必须充当直通,只是让样本流到管道的其余部分。第二个分支肯定很相似,唯一的区别是它相对于第一个分支要延迟n秒。

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

我已经尝试设置第二个分支的 queuemax-size-*min-threshold-time 属性(如 this 答案中的建议),但它不起作用.

我也试过通过queue.get_sink_pads().first().unwrap().set_offset(-5000000000)修改第二个分支的运行时间,可惜还是不行

我还尝试连接一个焊盘探针并重新标记通过第二个分支 queue 的接收器焊盘的缓冲区在未来 n 秒,希望它们能保留在 queue 直到管道的 运行 时间赶上,但它也没有工作(我想它没有工作,因为即使 tee 元素创建了单独的分支,缓冲区仍然通过引用共享)。

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

是否可以实现这种行为而不必从头开始实现插件?


为了尝试实现这种行为,我从实例化基本元素开始...

let videotestsrc = ElementFactory::make("videotestsrc", None)?;
let timeoverlay = ElementFactory::make("timeoverlay", None)?;
let tee = ElementFactory::make("tee", None)?;

...然后我实例化了管道...

let pipeline = Pipeline::new(None);
pipeline.add(&videotestsrc)?;
pipeline.add(&timeoverlay)?;
pipeline.add(&tee)?;

...然后我创建了分支...

{
    let queue = ElementFactory::make("queue", None)?;
    let autovideosink = ElementFactory::make("autovideosink", None)?;

    pipeline.add(&queue)?;
    pipeline.add(&autovideosink)?;

    tee.link(&queue)?;
    queue.link(&autovideosink)?;
}

{
    let queue = ElementFactory::make("queue", None)?;
    let autovideosink = ElementFactory::make("autovideosink", None)?;

    // queue.set_property_from_str("leaky", "downstream");
    // queue.set_property("max-size-buffers", &0u32)?;
    // queue.set_property("max-size-bytes", &0u32)?;
    // queue.set_property("max-size-time", &0u64)?;
    // queue.set_property("min-threshold-time", &5000000000u64)?;

    pipeline.add(&queue)?;
    pipeline.add(&autovideosink)?;

    tee.link(&queue)?;
    queue.link(&autovideosink)?;
}

第二个分支的评论是我尝试失败的结果。

I also tried to modify the running time of the second branch through queue.get_sink_pads().first().unwrap().set_offset(-5000000000) but alas, it also didn't work.

这几乎就是解决方案:设置一个正值,它应该可以工作。你目前正在把它转移到过去。此外,请确保 a) 在队列的源垫上设置偏移量,以及 b) 队列至少可以容纳与您设置的偏移量一样多的数据。