【问题标题】:GStreamer branch manipulationGStreamer 分支操作
【发布时间】:2015-10-29 09:08:09
【问题描述】:

我在 GStreamer 中有一个如下结构的管道:

rtspsrc -> rtph264depay -> 解析器 -> tee
-> 队列 -> (bin - MP4 文件)
-> 队列 -> (bin - RTP/UDP)

我希望能够在总线中断时删除(或添加)指定的分支。

我正在关注 gstreamer guide,第 19.4 节

当管道第一次开始播放时,一切都很好,一切都按照它应该的方式播放。我的问题是,当我添加一个分支时,它的元素不会进入 PLAYING 状态。除了保持在 READY 的最后一个元素外,它们一直到 PAUSED。我已经尝试将队列保持在 tee 上,并从队列中取消 bin 的链接。

当我尝试将队列放入 bin 并从 tee 链接/取消链接时,即使在阻塞分支并发送 EOS 之后,我仍无法移除 bin。

我应该如何进行这种动态分支操作?

编辑:设置 async=false 允许分支中的元素进入 PLAYING 但 bin [queue -> imxvpudec -> imxipuvideotransform -> videorate -> capsfilter -> imxvpuenc_h264 -> rtph264pay -> udpsink] 不会链接到发球台。尝试链接到使用 gst_element_get_compatible_pad() 检索到的焊盘会返回 GST_PAD_LINK_NOFORMAT。

【问题讨论】:

  • 欢迎来到 SO。我不明白你的问题,尤其是在考虑你设置的标签时。
  • 这种管道在很多地方都可能出错。添加新分支时,您是否明确将状态设置为“正在播放”?您能否粘贴管道的完整详细信息,包括您的 mux 和 parse 元素以及 bin 元素上的属性?
  • “不播放”位是固定的,这只是为所有接收器设置 async=false 的问题。我使用 h264parse 作为解析器,使用 mpegtsmux 作为多路复用器。但是,现在我只想考虑 udpsink 分支,当有一个 fakesink 代替文件分支时也会出现问题。我还在 udpsink 分支中使用 imxvpudec 和 imxvpuenc_h264 进行解码/编码。我现在面临的问题是,在链接 udpsink 分支时: queue -> imxvpudec -> imxipuvideotransform -> videorate -> capsfilter -> imxvpuenc_h264 -> rtph264pay -> udpsink ,没有发送数据

标签: gstreamer


【解决方案1】:

为了解决分支中的元素进入 PAUSED 但不播放的问题,除了 sink 到 READY 之外,需要将 sink 的“async”属性设置为“false”。

关于链接错误,由于某种原因,在链接 tee -> 分支时,tee 源的 Caps(使用“gst_element_get_compatible_pad()”找到)与前一个元素的源(解析器)不同。结果,当branch sink想要caps并查询tee时,查询到后面的元素,branch sink得到了和parser source一样的caps,与tee source不兼容。这是通过将解析器放在 tee 之后(在分支上)而不是在它之前来解决的(在我的情况下)。我不知道这是什么原因,但现在可以了。

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多