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本身提供了所需的接口。
我还尝试用 替换autovideosink,ximagesink然后用替换xvimagesink,两者都声称支持接口,但在这两种情况下,都没有找到支持接口的元素。
所以我的问题基本上是这样的:
1/我可以在上面的管道中插入一些提供接口的东西吗?
2/如果做不到这一点,有没有办法playbin正确分析流,然后捕获其输出并将其传递给更多过滤器?我正在考虑的事情是:
playbin location=X
! videoflip method=Y
! autovideosink
换句话说,我可以使用类似的video-sink属性playbin来阻止它创建自己的接收器,而是将其数据传递给videoflip?
我更喜欢可以实现的东西,Gst.Parse.Launch()因为如果可以避免的话,我真的不想手动创建每个管道元素。