How to include a gstreamer sink in a QML VideoItem?

匿名 (未验证) 提交于 2019-12-03 09:02:45

问题:

I'm trying to integrate a gsrtreamer video in a QT app using QML.

I've begun with the example qmlplayer2 which uses a distant video :

player->setUri(QLatin1Literal("http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi")); 

I've modified this example to use a pipeline to get an udpsrc :

    m_pipeline = QGst::Pipeline::create();     QGst::ElementPtr udp = QGst::ElementFactory::make(QLatin1Literal("udpsrc"));     udp->setProperty("address", "192.168.1.1");     udp->setProperty("port", 3333);     QGst::ElementPtr decodage = QGst::ElementFactory::make("jpegdec");     QGst::ElementPtr videosink = QGst::ElementFactory::make("autovideosink"); 

Which is equivaltent to :

gst-launch-1.0 udpsrc address=192.168.1.1 port=3333 ! jpegdec ! autovideosink 

This works, I get my video streamed and my play/pause/stop buttons working.

But The video is in an different window

Whereas my QML is specifying that VideoItem is in the main window :

Rectangle {     id: window     width: 600     height: 300     Column {         width: 600         height: 544         y : 10;         VideoItem {             id: video             y : 10;             width: window.width             height: 260             surface: videoSurface1 //bound on the context from main()         }         // Other buttons 

Every topic I found is either too old (gstreamer is native in Qt since 5.5 this year) or does not have answers

Is there a mistake in my work ?

Is there an other way to do what I want?

Thanks.

回答1:

The problem here is autovideosink doesn't implement "GstVideoOverlay". In your pipeline your should use as a sink element one of this elements "xvimagesink,ximagesink" or use "playbin" directly, this elements implements "GstVideoOverlay" interface .

Here an example using "playbin". Note this example is using pure Gstreamer without QT wrapers.

GstElement *pipeline = gst_element_factory_make("playbin", "playbin"); /* Set the URI to play */ g_object_set(pipeline, "uri", url, NULL); gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(pipeline), windowsID); 

*windowsID is the widget id where you want draw your video output. *url is your video url. For you would be "udp://192.168.1.1:3333"



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!