动态(取消)链接正在运行的(GStreamer)管道中的元素? [英] dynamically (un)link elements in a running (gstreamer) pipeline?

查看:21
本文介绍了动态(取消)链接正在运行的(GStreamer)管道中的元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

GStreamer文档中有大量关于构造和运行静态管道的示例。 然而,在媒体实际流动的情况下,没有太多关于更改/重新链接实时管道中的元素的内容。 这绝对是可能的,所以问题是:

  1. 在尝试此操作之前,我应该了解哪些GStreamer概念/机制?
  2. 是否有需要注意的陷阱?
  3. 基本程序是什么,或者是一个很好的例子?

接受的答案将是填鸭式的、全面的,并带有源代码

推荐答案

  1. 我最喜欢的理解链接(和动态链接)的"概念"是将管道视为有水流过的真正管道。一旦你这样做了,有些事情就会变得非常明显。比如,"你在连接元素之前是否将信号源设置为播放?",变成了"你在连接软管之前打开水龙头吗?",它会自动回答。对于动态链接,如何才能确保没有水"泄漏"(这很糟糕,GStreamer中的"泄漏"等同于得到一个GST_FLOW_NOT_LINKED,并且会阻止您的源和乐趣)或被堵塞(可能导致丢包或拥塞)。

    /li>
  2. 是的。许多。有一点免责声明,我目前仍在使用0.10,其中一些问题可能已经在1.0中修复了,不幸的是,使用GStreamer 0.10进行动态链接和取消链接非常非常困难。让我解释一下: 假设您正在使用T形三通,并且希望取消一个分支的链接。您可以从释放Tees srcpad开始(不要介意取消它的链接,这是释放垫的一部分),现在您应该可以安全地拆除该垫下游的元素。(相当于水的当量是,你在三通之后关闭一个阀门,现在应该能够在阀门之后拆除管道,除非你想弄湿,否则你不会在没有先关闭阀门的情况下开始拆除管道。) 这在大多数情况下都会奏效,但这是一场竞赛。因为在释放焊盘后,在该焊盘上可能仍有推送或焊盘分配,如果您现在在代码中开始拆卸下游元素,这可能会崩溃,因为如果某些元素在拆卸时受到推送或焊盘分配,或者您得到GST_FLOW_WROR_STATE或GST_FLOW_NOT_LINKED,它们将返回源代码,停止所有人的流...

    /li>
  3. 我用它做了很多实验,发现如果你需要稳定性,偶尔崩溃/冻结不是一个选项,你需要一个元素来作为你的动态安全网。一个元素,它将保证在释放/取消链接Pad后绝对不会在Pad上发生任何活动。要做到这一点,唯一的方法是打破GStreamer的另一个范例,即在持有锁的同时不推送:您需要在推送/发送事件/垫分配的同时持有锁。我前段时间here做了这样的事情。(测试用例当然是最重要的事情,因为它允许您测试自己的/其他元素的安全性) 您还可以想象一个无锁的元素,它将吞下所有不好的FlowReturns,并为其上游绘制一幅漂亮的图景,但然后您需要绝对确保所有下游元素都将是安全的,因为您的元素不能保证一旦执行了"停止流"(释放/取消链接),就不会挤出一点。

当然,你必须正确看待其中的一些问题。我所说的这些可怕的竞争条件的窗口实际上非常非常小,而且可能只发生在您运行程序的第1000次或10.000次。但对于专业应用程序来说,这当然是不可接受的。我做了一次演讲,其中我谈到了一些事情here

这篇关于动态(取消)链接正在运行的(GStreamer)管道中的元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆