Post-处理 GStreamer playbin 管道
Post-process GStreamer playbin pipeline
GStreamer 中的 playbin
管道是一件很棒的事情,因为我不需要 任何 关于处理流所需的各个元素的真实知识。
但是,如果我想将视频旋转 90 度(或翻转它,或其他任何东西),看来我必须手动编写管道代码。目前,我正在这样做:
rtspsrc location=X
! rtph264depay
! h264parse
! decodebin
! videoflip method=Y
! videoconvert
! autovideosink
但是,因为我将视频绑定到特定的 Gtk 小部件,所以我捕获了要求小部件 ID 的消息并将其提供回 GStreamer,以便它可以正确绑定。
不幸的是,根据 gst-inspect-1.0
,上面管道中的那些元素 none 似乎实际上提供了 GstVideoOverlay
接口,因此,当我查询一个可以接收小部件标识符,我得到 null
后很快出现空指针错误。或者,如果在返回 null
时我什么都不做,则不会发生绑定,GStreamer 会打开一个单独的 window 来流式传输视频。
原来是playbin
自己提供了需要的接口
我还尝试用 ximagesink
替换 autovideosink
,然后用 xvimagesink
替换,两者都声称支持该界面,但在这两种情况下,都没有找到支持的元素界面。
所以我的问题基本上是这样的:
1/ 我可以在上面的管道中插入一些东西来提供接口吗?
2/ 如果做不到这一点,是否有一种方法可以使用 playbin
正确分析流,然后捕获其输出并将其传递给更多过滤器?我正在考虑的事情是:
playbin location=X
! videoflip method=Y
! autovideosink
换句话说,我可以使用 playbin
的 video-sink
属性 之类的东西来阻止它创建自己的接收器,而是将其数据传递给 videoflip
?
我更喜欢可以用 Gst.Parse.Launch()
实现的东西,因为如果可以避免的话,我真的不想手动创建每个管道元素。
我会说你请求 GstVideoOverlay 的方式不正确或者 GStreamer 中存在错误,xvimagesink 和 ximagesink 都支持 GstVideoOverlay 接口。 autovideosink 不支持,但它里面的 videosink 可能会支持。
无论如何,您希望将自定义素材箱设置为视频接收器 属性。你可以创建你的容器并将你想要的元素放入其中,创建一个接收器 ghostpad 然后将它设置为你的 playbin 的视频接收器。
也可以使用解析启动语法来实现:
gst-launch-1.0 playbin video-sink="videoconvert ! videoscale ! aasink" uri=file://<path/to/some/file>
只需将 bin 元素替换为您需要的任何元素即可。
GStreamer 中的 playbin
管道是一件很棒的事情,因为我不需要 任何 关于处理流所需的各个元素的真实知识。
但是,如果我想将视频旋转 90 度(或翻转它,或其他任何东西),看来我必须手动编写管道代码。目前,我正在这样做:
rtspsrc location=X
! rtph264depay
! h264parse
! decodebin
! videoflip method=Y
! videoconvert
! autovideosink
但是,因为我将视频绑定到特定的 Gtk 小部件,所以我捕获了要求小部件 ID 的消息并将其提供回 GStreamer,以便它可以正确绑定。
不幸的是,根据 gst-inspect-1.0
,上面管道中的那些元素 none 似乎实际上提供了 GstVideoOverlay
接口,因此,当我查询一个可以接收小部件标识符,我得到 null
后很快出现空指针错误。或者,如果在返回 null
时我什么都不做,则不会发生绑定,GStreamer 会打开一个单独的 window 来流式传输视频。
原来是playbin
自己提供了需要的接口
我还尝试用 ximagesink
替换 autovideosink
,然后用 xvimagesink
替换,两者都声称支持该界面,但在这两种情况下,都没有找到支持的元素界面。
所以我的问题基本上是这样的:
1/ 我可以在上面的管道中插入一些东西来提供接口吗?
2/ 如果做不到这一点,是否有一种方法可以使用 playbin
正确分析流,然后捕获其输出并将其传递给更多过滤器?我正在考虑的事情是:
playbin location=X
! videoflip method=Y
! autovideosink
换句话说,我可以使用 playbin
的 video-sink
属性 之类的东西来阻止它创建自己的接收器,而是将其数据传递给 videoflip
?
我更喜欢可以用 Gst.Parse.Launch()
实现的东西,因为如果可以避免的话,我真的不想手动创建每个管道元素。
我会说你请求 GstVideoOverlay 的方式不正确或者 GStreamer 中存在错误,xvimagesink 和 ximagesink 都支持 GstVideoOverlay 接口。 autovideosink 不支持,但它里面的 videosink 可能会支持。
无论如何,您希望将自定义素材箱设置为视频接收器 属性。你可以创建你的容器并将你想要的元素放入其中,创建一个接收器 ghostpad 然后将它设置为你的 playbin 的视频接收器。
也可以使用解析启动语法来实现:
gst-launch-1.0 playbin video-sink="videoconvert ! videoscale ! aasink" uri=file://<path/to/some/file>
只需将 bin 元素替换为您需要的任何元素即可。