gstreamer向通过gst_parse_launch

时间:2018-09-05 15:01:47

标签: c++ gstreamer

我试图创建一个管道,然后在创建它之后添加一个视频接收器。我需要这样做,以便在将其提交到管道之前,可以设置videosink的视频叠加窗口ID。

所以我有这个代码

pipeline = gst_parse_launch( "filesrc location=file.svg ! rsvgdec ! imagefreeze", &err );

sink = gst_element_factory_make( "glimagesink" );

gst_video_overlay_set_window_handle( GST_VIDEO_OVERLAY( sink ), this->winId() );

gst_bin_add_many( GST_BIN( pipeline ), sink, nullptr );

if ( !gst_element_link_many( pipeline, sink, nullptr ) )
{
    qCritical() << "Unable to link elements";
}

运行时,它无法链接元素。

知道为什么会这样。我假设这是因为我试图将一个元素链接到“ bin”而不是另一个元素。但是,我看不到有人将元素添加到通过gst_parse_launch创建的管道中的任何示例。

1 个答案:

答案 0 :(得分:1)

您无法将其连接到垃圾箱。您需要指定一个打击垫-或尝试从中选择打击垫的元素。因此,您需要遍历bin并从列表中选择imagefreeze元素。

替代方法-添加接收器并从管道中获取它:

pipeline = gst_parse_launch( "filesrc location=file.svg ! rsvgdec ! imagefreeze ! glimagesink name=mysink", &err );

GstElement *sink = gst_bin_get_by_name( GST_BIN( pipeline ), "mysink" );

gst_video_overlay_set_window_handle( GST_VIDEO_OVERLAY( sink ), this->winId() );

gst_object_unref( sink );

您在这里可能遇到的问题也很棘手,可能需要videoconvert才能满足接收​​器的格式要求。

filesrc location=file.svg ! rsvgdec ! imagefreeze ! videoconvert ! glimagesink

或者也许

filesrc location=file.svg ! rsvgdec ! imagefreeze ! glupload ! glcolorconvert ! glimagesink