Qt and gstreamer



  • Hi I have made a program based on the example of gstreamer-1.0 "GstOverlay and Qt" but the video is not displayed in my widget
    I play the same video with the same pipeline with gst-launch but in my program with Qt the video is not displayed (Qt5.12.3 and gstreamer 1.10 )
    I think my .pro is not correct :

    #-------------------------------------------------
    #
    # Project created by QtCreator 2017-11-06T21:33:02
    #
    #-------------------------------------------------
    
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = gst01
    TEMPLATE = app
    INCLUDEPATH +="/usr/include"
    INCLUDEPATH +="/usr/include/glib-2.0"
    INCLUDEPATH +="/usr/include/gstreamer-1.0"
    CONFIG += link_pkgconfig
    PKGCONFIG += gstreamer-1.0
    PKGCONFIG += gstreamer-video-1.0
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which as been marked as deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    LIBS+=-L"/usr/lib/x86_64-linux-gnu/gstreamer-1.0" -lgstxvimagesink -L"/usr/lib/x86_64-linux-gnu" -lgstbase-1.0 -lgstreamer-1.0 -lglib-2.0 -lgobject-2.0
    
    SOURCES += main.cpp\
            mainwindow.cpp
    
    HEADERS  += mainwindow.h
    
    FORMS    += mainwindow.ui
    

    my pipeline is filesrc and decodebin and xvimagesink and my code is like the exemple here : GstVideoOverlay

    can someone help me ?


  • Lifetime Qt Champion

    Hi,

    What Linux distribution are you running ?
    What Desktop Environment are you using ?
    What window manager are you using ?



  • @SGaist Hi, I was (at home) on my debian 9 with kde5 plasma but I should try too on centOs (because the target is RHEL).I can display my video with gst-launch but not with my program


  • Moderators

    @stephane78-0
    since you are using gstreamer-1.0, did you also compile Qt with gstreamer-1.0 support? AFAIK it uses gstreamer-0.1 by default



  • @raven-worx Hi thank you,no I didn't compile Qt with gstreamer 1.0 support but do you think I need this ? because I use only a QWidget and the winId handle of the QWidget , here is my code :```

    #include <glib.h>
    #include <gst/gst.h>
    #include <gst/video/videooverlay.h>

    #include <QApplication>
    #include <QTimer>
    #include <QWidget>

    int main(int argc, char *argv[])
    {
    if (!g_thread_supported ())
    g_thread_init (NULL);

    gst_init (&argc, &argv);
    QApplication app(argc, argv);
    //MainWindow w;
    QWidget w;
    w.resize(640,480);

    app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit ()));

    // prepare the pipeline

    GstElement *pipeline = gst_pipeline_new ("xvoverlay");
    GstElement *videosrc = gst_element_factory_make ("filesrc","videosrc");
    GstElement *videoscale=gst_element_factory_make("videoscale",NULL);
    GstElement *capsfilter=gst_element_factory_make("capsfilter",NULL);
    GstElement *sink = gst_element_factory_make ("xvimagesink", NULL);
    GstElement *decodebin = gst_element_factory_make("decodebin", NULL);

    //g_object_set (G_OBJECT(playbin),"uri","file:///home/user/Downloads/thesimpsonstrailer.mp4");
    g_object_set (G_OBJECT (videosrc), "location", "/home/user/Downloads/small.mp4", NULL);
    GstCaps *caps = gst_caps_new_simple ("video/x-raw",
    "format", G_TYPE_STRING, "RGB",
    "framerate", GST_TYPE_FRACTION, 25, 1,
    "width", G_TYPE_INT, 640,
    "height", G_TYPE_INT, 480,NULL);

    g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
    gst_caps_unref (caps);
    gst_bin_add_many (GST_BIN (pipeline), videosrc, decodebin, sink, NULL);
    gst_element_link_many(videosrc, decodebin, NULL);
    gst_element_link_many(decodebin, sink, NULL);

    // prepare the ui

    w.show();
    

    gst_element_set_state(sink, GST_STATE_READY);
    WId xwinid =w.winId();
    gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid);

    // run the pipeline

    GstStateChangeReturn sret = gst_element_set_state (pipeline,
    GST_STATE_PLAYING);
    if (sret == GST_STATE_CHANGE_FAILURE)
    {
    gst_element_set_state (pipeline, GST_STATE_NULL);
    gst_object_unref (pipeline);
    // Exit application
    QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
    }

    int ret = app.exec();

    w.hide();

    gst_element_set_state (pipeline, GST_STATE_NULL);
    gst_object_unref (pipeline);

    return ret;
    }


  • Moderators

    @stephane78-0
    oh sry...i thought you are talking about the QtMultimedia module



  • @raven-worx Hi ,you have perhaps a good idea I will try to compile Qt with gstreamer 1.0 support and I come again back


  • Lifetime Qt Champion

    Did you check the winID value ?



  • @SGaist Hi,yes xwinId=228589573



  • Hi, I have tryed another method with the plugin qmlsink s owith qml but I have a black screen, my code comes from an exemple of the plugin good on github:

    int main(int argc, char *argv[])
    {
      int ret;
    
      gst_init (&argc, &argv);
    
      {
        QGuiApplication app(argc, argv);
    
        GstElement *pipeline = gst_pipeline_new (NULL);
        //GstElement *src = gst_element_factory_make ("videotestsrc", NULL);
        GstElement *src = gst_element_factory_make ("filesrc","videosrc");
        GstElement *glupload = gst_element_factory_make ("glupload", NULL);
        GstElement *decodebin = gst_element_factory_make("decodebin", NULL);
        /* the plugin must be loaded before loading the qml file to register the
         * GstGLVideoItem qml item */
        GstElement *sink = gst_element_factory_make ("qmlglsink", NULL);
    
        g_assert (src && glupload && sink);
        g_object_set (G_OBJECT (src), "location", "/home/user/Downloads/small.mp4", NULL);
        gst_bin_add_many (GST_BIN (pipeline), src, decodebin, glupload, sink, NULL);
        gst_element_link_many (src, decodebin, glupload, sink, NULL);
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    
        QQuickItem *videoItem;
        QQuickWindow *rootObject;
    
        /* find and set the videoItem on the sink */
        rootObject = static_cast<QQuickWindow *> (engine.rootObjects().first());
        videoItem = rootObject->findChild<QQuickItem *> ("videoItem");
        g_assert (videoItem);
        g_object_set(sink, "widget", videoItem, NULL);
    
        rootObject->scheduleRenderJob (new SetPlaying (pipeline),
            QQuickWindow::BeforeSynchronizingStage);
    
        ret = app.exec();
    
        gst_element_set_state (pipeline, GST_STATE_NULL);
        gst_object_unref (pipeline);
      }
    
      gst_deinit ();
    
      return ret;
    

    so there is perhaps a problem with my debian 9 or it lacks a library


  • Lifetime Qt Champion

    Do you get any error message on the console ?



  • @SGaist No there isn't any error message in the console


  • Lifetime Qt Champion

    Does it work if you follow GStreamer's Qt example ?



  • @SGaist I will try it,because I have modified it to have as source my video.so I will try the example not modified and come here again.



  • @SGaist the example without my modifications runs well.so there is something with my filesrc.but I can play my video with gstlaunch and decodebin and xvimagesink.


  • Lifetime Qt Champion

    Then I would gradually modify the example until it does play the file you are trying to play with your code.


 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.