后处理GStreamer playbin管道

时间:2016-02-26 04:06:29

标签: gstreamer gstreamer-sharp

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实现的东西,因为如果我能避免的话,我真的不想手动创建每一个管道元素。

1 个答案:

答案 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元素。