GStreamer中的playbin
管道非常棒,因为我不需要任何真正了解处理流所需的各个元素。
但是,如果我想将视频旋转90度(或翻转它或其他任何东西),似乎我必须手动编写管道代码。目前,我正在这样做:
rtspsrc location=X
! rtph264depay
! h264parse
! decodebin
! videoflip method=Y
! videoconvert
! autovideosink
但是,因为我将视频绑定到特定的Gtk小部件,所以我会捕获要求小部件ID的消息并将其提供给GStreamer以便它可以正确绑定。
不幸的是,根据gst-inspect-1.0
,上面管道中的这些元素似乎都没有实际提供GstVideoOverlay
接口,所以当我查询可以接收小部件标识符的那个时,我得{ {1}}非常快地跟随空指针错误。或者,如果在返回null
时我什么都不做,则不会发生绑定,GStreamer会打开一个单独的窗口来传输视频。
事实证明null
本身提供了所需的界面。
我还尝试将playbin
替换为autovideosink
,然后替换为ximagesink
,两者都声称支持接口,但在这两种情况下,都没有找到支持接口的元素
所以我的问题基本上是这样的:
1 /我可以在上面提供接口的管道中插入一些东西吗?
2 /如果失败了,有没有办法使用xvimagesink
正确分析流,然后捕获其输出并通过更多过滤器传递?我正在考虑的事情是:
playbin
换句话说,我可以使用类似playbin location=X
! videoflip method=Y
! autovideosink
video-sink
属性的内容来阻止它创建自己的接收器,而是将其数据传递给playbin
吗?
我更喜欢可以用videoflip
实现的东西,因为如果我能避免的话,我真的不想手动创建每一个管道元素。
答案 0 :(得分:1)
我说你请求GstVideoOverlay的方式不正确或GStreamer中存在错误,xvimagesink和ximagesink都支持GstVideoOverlay界面。 autovideosink并不是,但它内部的视频会很可能会支持。
无论如何,您希望将自定义bin设置为video-sink属性。您可以创建bin并将所需的元素放入其中,创建一个sink ghostpad,然后将其设置为playbin的视频接收器。
也可以使用解析启动语法来执行此操作:
<?php
$data = substr($_POST['imageData'], strpos($_POST['imageData'], ",") + 1);
$decodedData = base64_decode($data);
$fp = fopen("canvas.png", 'wb');
fwrite($fp, $decodedData);
fclose();
//echo "/canvas.png";?>
只需用您需要的任何东西替换bin元素。