控制 gstreamer 源插件的输出速率

Posted

技术标签:

【中文标题】控制 gstreamer 源插件的输出速率【英文标题】:controlling gstreamer source plugin's output rate 【发布时间】:2014-07-15 16:06:12 【问题描述】:

全部,

我有一个 gstreamer 源插件,它从 avi 文件中读取视频帧。它连接到 gstreamer 的核心 tee 和两个队列元素,以将视频帧推送到两个视频处理元素。这两个视频处理元素的输出由我的 mux 插件混合。

使用 tee 和队列,目前我的 gstreamer 源插件不断将近 6-10 个视频帧推送到两个队列 - 我相信直到队列限制被填满。我想要的是从我的源插件中只推送一个视频帧,然后等待来自我的 mux 插件的信号用于下一帧。

有人可以指导如何在 gstreamer 框架中实现这一点吗?

谢谢! ARM

附:我尝试使用队列元素的 max-size-buffers 属性设置为 1,但它不起作用。

【问题讨论】:

【参考方案1】:

看看现有的 GStreamer 多路复用器。基本上,速率控制是通过使用 GstCollectPads 在每个 sinkpad 上等待一个缓冲区然后阻塞来完成的,一旦每个 sinkpad 都有一个缓冲区,您就可以将它们混合在一起(正确地使它们相互同步),然后转发数据。因此,速率控制是通过在 muxer 内部阻塞来完成的,并且只有当 muxer 解除阻塞(即消耗一个缓冲区)时,才能在该 sinkpad 上推送一个新的缓冲区。

复用器前面的队列与此无关,但如果您想保持较低的内存使用率,可以使用 max-size-buffers=1 或类似设置。

【讨论】:

感谢塞巴斯蒂安的回答!从 avi 读取 6-10 帧并推送到两个队列的行为发生在第一个视频帧缓冲区到达我的多路复用器之前。所以,我不明白多路复用器级别的阻塞如何有助于减慢源插件的帧推送速度。 它将减慢从源插件推送帧的速度,直到队列满为止。然后源被阻塞,直到队列有空间用于另一个缓冲区,并且当您的复用器消耗一个缓冲区时,总是有另一个缓冲区的空间。如果您的两个源管道部分彼此独立,您也可以不使用队列,或者队列上的 max-size-buffers=1 也应该这样做。你说它没有,但也许这是其他地方的问题。你能提供一些代码吗? 当然。我将通过电子邮件发送代码,以便您重现。请给我你的电子邮件。仅供参考.. max-size-buffers=1 根据我的理解不能按预期工作。队列一旦获得第一个缓冲区就应该阻塞它的接收器垫,因此源插件也会阻塞。我所看到的,它在阻塞之前缓冲了至少 3 个设置为 max-size-buffers=1 的缓冲区。 这意味着队列将缓冲区转发到下游。使用 max-size-buffers=1 它只能容纳一个缓冲区。你可以在coaxion.net找到我的邮件地址

以上是关于控制 gstreamer 源插件的输出速率的主要内容,如果未能解决你的问题,请参考以下文章

随时随地在 GStreamer 管道中添加和删除音频源

如何从 gstreamer 中的源请求更多缓冲区?

pocketsphinx python gstreamer 音频速率

gstreamer移植qnx:编写gstreamer插件audio sink和video sink

gstreamer如何查看相关插件信息(src/sink)?

图像数据作为 gstreamer 中的源 [关闭]