将多个动态流合并为一个

merge multiple dynamic streams into one

我有以下管道:

 appsrc->h264parse->av264_dec->videoconvert->x264enc->appsink

我正在将 h264 流送入 appsrc(连同时间戳)并从 appsink 中获取 h264 流(也连同时间戳)。这对我有用。

但是,我想要一个有两个输入 (appsrc...) 和只有一个输出 (appsink) 的管道。这个想法是,所有输入都不断地输入数据并解码,但只有其中一个被选择用于输出(其他被丢弃)。

为简单起见,我们可以假设一个流是背景流(例如由 videotestsrc 生成)并且始终可用。其他流可以 appear/disappear 在不同的时间,为简单起见,我们可以假设一个流只出现一次(另一个出现是新流)。

现在的问题是如何组织这些流之间的切换?我应该用另一种方式取消link GstElements 和link 它们吗?或者我应该使用 input-selector?那么 input-selector 对来自非活动垫的流有何作用?它是丢弃它们还是搁置它们并在 pad 再次激活时消耗?

我对时间戳的理解似乎也有问题。送入每个 appsrc 的流具有单独的一组时间戳。为简单起见,我们可以假设每个时间戳都从 0 开始。但是,由于这些流在墙上时间的不同点开始,一个流中的 0 并不意味着与另一个流中的 0 相同。因此问题是它们应该如何同步?在将数据注入每个 appsrc(计算偏移量)时,是否应该以某种方式手动完成此操作,或者 GStreamer 是否提供任何机制来解决此问题,可能稍后在管道中?

听起来 compositor 要素可能对您有所帮助。您可以在此处 arrange/compose 不同的流。我猜你可以把一个流放在另一个上面,然后用输入板的 zorder 属性 切换它们的外观。