gpt4 book ai didi

audio - 动态(取消)链接正在运行的(gstreamer)管道中的元素?

转载 作者:行者123 更新时间:2023-12-04 03:30:59 25 4
gpt4 key购买 nike

gstreamer 文档中有很多关于构建和运行静态管道的示例。
然而,在实时管道中更改/重新链接元素并不多 - 而媒体实际上是流动的。
这绝对是可能的,所以问题是:

  • 在尝试之前,我应该了解哪些 gstreamer 概念/机制?
  • 有什么陷阱需要注意吗?
  • 什么是基本程序,或者一个很好的例子?

  • 接受的答案将是勺子喂养的,全面的,并带有源代码

    最佳答案

  • 我最喜欢的理解链接(和动态链接)的“概念”是将管道视为真正的管道,水流过它。一旦你这样做了,有些事情就会变得非常明显。比如,“在连接元素之前,你是否将源设置为 PLAYING?”,变成“在连接软管之前你是否打开水?”,它本身就给出了答案。使用动态链接更是如此,您如何确保没有水“泄漏”(这很糟糕,GStreamer 中的“泄漏”相当于获得 GST_FLOW_NOT_LINKED,并且会停止您的来源和乐趣)或被堵塞(可以导致数据包丢失或拥塞)。
  • 是的。许多。有一点免责声明,我目前仍在使用 0.10,其中一些可能已在 1.0 中修复,不幸的是,使用 GStreamer 0.10 进行动态链接和取消链接非常非常困难。让我解释:
    假设您正在使用 T 恤,并且想要取消链接一个分支。您可以从释放 Tees srcpad 开始(不要介意取消链接,这是释放垫的一部分),现在您应该能够安全地拆除该垫下游的元素。 (相当于水是在三通后关闭阀门,现在应该能够在阀门后拆除管道,除非你想弄湿,否则你不会在不先关闭阀门的情况下开始拆除管道......)
    这在大多数情况下都会起作用,但这里有一场比赛。因为在你释放了 pad 之后,可能仍然有一个 push 或 pad-alloc 在他们的路上,如果你现在在你的代码中开始拆除下游元素,这可能会因为存在的竞争而崩溃在某些元素中,如果它们在拆卸时获得推送或填充分配,或者您获得 GST_FLOW_WRONG_STATE 或 GS​​T_FLOW_NOT_LINKED,它们将返回源停止每个人的流...
  • 我对此做了很多实验,发现如果你需要稳定性,偶尔崩溃/卡住不是一种选择,你需要一个元素来作为你的动态安全网。一个元素,可保证在您释放/取消链接后绝对不会在打击垫上发生任何事件。做到这一点的唯一方法是打破另一种 GStreamer 持有锁时不推送的范式:您需要在推送/发送事件/填充分配时持有锁。我前一段时间做了这样的事情here . (当然,测试用例是最重要的,因为它允许您测试自己/其他元素的安全性)
    您还可以想象一个无锁元素会吞下所有糟糕的 FlowReturns,并为其上游绘制一幅漂亮的图画,但是您需要绝对确定您的所有下游元素都将“收到推送或填充分配”在关闭时“-安全”,因为您的元素无法保证一旦“停止流动”(释放/取消链接)已执行,一点点滴水就不会挤过去。

  • 当然,您必须正确看待其中的一些问题。我正在谈论的这些可怕的竞争条件的窗口实际上非常非常小,并且可能只会在您运行程序的每 1000 次或 10.000 次发生。但是对于专业应用,这当然是 Not Acceptable 。我做了一个演讲,其中涵盖了一些此类内容 here

    关于audio - 动态(取消)链接正在运行的(gstreamer)管道中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3074145/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com