【问题标题】:Post-process GStreamer playbin pipeline后处理 GStreamer playbin 管道
【发布时间】:2016-02-26 04:06:29
【问题描述】:

GStreamer 中的playbin 管道非常棒,因为我不需要任何真正了解处理流所需的各个元素。

但是,如果我想将视频旋转 90 度(或翻转它,或其他任何东西),我似乎必须手动编写管道代码。目前,我正在这样做:

rtspsrc location=X
    ! rtph264depay
    ! h264parse
    ! decodebin
    ! videoflip method=Y
    ! videoconvert
    ! autovideosink

但是,因为我将视频绑定到特定的 Gtk 小部件,所以我捕获了询问小部件 ID 的消息并将其提供回 GStreamer,以便它可以正确绑定。

不幸的是,根据gst-inspect-1.0,上述管道中的这些元素似乎都没有真正提供GstVideoOverlay 接口,因此,当我查询可以接收小部件标识符的接口时,我得到null 非常紧随其后很快就会出现空指针错误。或者,如果在返回 null 时我什么都不做,则不会发生绑定,GStreamer 会打开一个单独的窗口来流式传输视频。

原来playbin本身就提供了所需的接口。

我还尝试用ximagesink 替换autovideosink,然后用xvimagesink 替换,两者都声称支持该接口,但在这两种情况下,都没有找到支持该接口的元素。

所以我的问题基本上是这样的:

1/ 我可以在上面提供接口的管道中插入一些东西吗?

2/ 如果做不到这一点,有没有办法使用playbin 正确分析流,然后捕获其输出并通过更多过滤器?我正在考虑的事情是:

playbin location=X
    ! videoflip method=Y
    ! autovideosink

换句话说,我可以使用类似playbinvideo-sink 属性来阻止它创建自己的接收器,而是将其数据传递给videoflip

我更喜欢可以用Gst.Parse.Launch() 实现的东西,因为如果可以避免的话,我真的不想手动创建每个管道元素。

【问题讨论】:

    标签: gstreamer gstreamer-sharp


    【解决方案1】:

    我会说您请求 GstVideoOverlay 的方式不正确或 GStreamer 中存在错误,xvimagesink 和 ximagesink 都支持 GstVideoOverlay 接口。 autovideosink 不支持,但它里面的videosink 可能会支持。

    无论如何,您希望将自定义 bin 设置为 video-sink 属性。您可以创建您的 bin 并将您想要的元素放入其中,创建一个 sink ghostpad,然后将其设置为 playbin 的 video-sink。

    也可以使用 parse-launch 语法来做到这一点:

    gst-launch-1.0 playbin video-sink="videoconvert ! videoscale ! aasink" uri=file://<path/to/some/file>
    

    只需将 bin 元素替换为您需要的任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多