Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Installation and Deployment
  4. Building with Gstreamer on Windows
QtWS25 Last Chance

Building with Gstreamer on Windows

Scheduled Pinned Locked Moved Solved Installation and Deployment
32 Posts 2 Posters 10.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • erikherzE Offline
    erikherzE Offline
    erikherz
    wrote on last edited by
    #1

    I created a very simple project with one source file (main.cpp) to render video from a Gstreamer pipeline into a QWidget. It builds and runs properly on OSX but not Windows. I tried with Gstreamer MinGW 64 and 32 as well as with MSVC 64. My error is:

    Project ERROR: gstreamer-1.0 development package not found

    I saw this post: https://forum.qt.io/topic/74652/building-qt-gstreamer ... but before stepping through its recommendations I was hoping to get a more recent update on the correct steps.

    Here is my .pro file:

    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++11
    
    DEFINES += QT_DEPRECATED_WARNINGS
    
    SOURCES += \
        main.cpp
    
    HEADERS +=
    
    CONFIG += link_pkgconfig
    
    PKGCONFIG += gstreamer-1.0 \
            glib-2.0 \
            gobject-2.0 \
            gio-2.0
    
    linux {
        PKGCONFIG += gstvideo-1.0
        LIBS += -L/usr/lib/i386-linux-gnu/ -lgstvideo-1.0
    }
    
    mac {
        PKG_CONFIG = /usr/local/bin/pkg-config
        PKGCONFIG += gstreamer-video-1.0
    }
    
    win32 {
        INCLUDEPATH += c:/gstreamer/1.0/x86_64/include \
                       c:/gstreamer/1.0/x86_64/lib/gstreamer-1.0/include \
                       c:/gstreamer/1.0/x86_64/include/gstreamer-1.0 \
                       c:/gstreamer/1.0/x86_64/include/glib-2.0 \
                       c:/gstreamer/1.0/x86_64/include/glib-2.0/glib \
                       c:/gstreamer/1.0/x86_64/include/glib-2.0/include
    
    
        DEPENDPATH += c:/gstreamer/1.0/x86_64/lib/
    
        LIBS += -Lc:/gstreamer/1.0/x86_64/lib
        LIBS += c:/gstreamer/1.0/x86_64/lib/glib-2.0.lib
        LIBS += -lglib-2.0 -lwinpthread -lgstreamer-1.0 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0
    
        CONFIG += c:/gstreamer/1.0/x86_64/lib/pkgconfig
    }
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    
    

    Here is main.cpp

    #include <QApplication>
    #include <QFrame>
    #include <QTimer>
    #include <QDebug>
    #include <QLabel>
    #include <QWidget>
    #include <QVBoxLayout>
    #include <gst/gst.h>
    
    #include <gst/video/videooverlay.h>
    
    /* added to work on OSX */
    #ifdef __APPLE__
    #ifdef TARGET_OS_MAC
    #include <glib/deprecated/gthread.h>
    #endif
    #endif
    
    void gst(int argc, char *argv[]) {
    if (!g_thread_supported ())
         g_thread_init (NULL);
    
       gst_init (&argc, &argv);
       QApplication app(argc, argv);
       app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit ()));
    
       GstElement *pipeline =
               gst_parse_launch
               (
                   "videotestsrc is-live=true ! glimagesink",
               NULL);
        GstElement *sink  =  gst_bin_get_by_name(GST_BIN(pipeline), "sink");
    
       // prepare the ui
    
        QWidget window;
    
        QLabel *label = new QLabel("Hi");
        QWidget *widget = new QWidget();
        WId xwinid = widget->winId();
        gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid);
    
        QVBoxLayout qboxLayout;
        qboxLayout.addWidget(label);
        qboxLayout.addWidget(widget);
        window.setLayout(&qboxLayout);
    
        window.resize(320, 240);
        window.show();
    
       //WId xwinid = label2->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();
    
    }
    
    int main(int argc, char *argv[])
    {
        gst(argc, argv);
    }
    
    
    
    
    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi and welcome to devnet,

      Might be a silly question but do you have the pkg-config files for GStreamer on Windows ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • erikherzE Offline
        erikherzE Offline
        erikherz
        wrote on last edited by
        #3

        Great to meet you!

        Here are my pkg-config files for "gstreamer":

        C:\Users\vivoh>C:\gstreamer\1.0\x86_64\bin\pkg-config.exe --list-all | findstr gstreamer
        gstreamer-gl-1.0           GStreamer OpenGL Plugins Libraries - Streaming media framework, OpenGL plugins libraries
        gstreamer-tag-1.0          GStreamer Tag Library - Tag base classes and helper functions
        gstreamer-net-1.0          GStreamer networking library - Network-enabled GStreamer plug-ins and clocking
        gstreamer-sdp-1.0          GStreamer SDP Library - SDP helper functions
        gstreamer-1.0              GStreamer - Streaming media framework
        gstreamer-bad-audio-1.0    GStreamer bad audio library, uninstalled - Bad audio library for GStreamer elements, Not Installed
        gstreamer-allocators-1.0   GStreamer Allocators Library - Allocators implementation
        gstreamer-player-1.0       GStreamer Player - GStreamer Player convenience library
        gstreamer-insertbin-1.0    GStreamer Insert Bin - Bin to automatically and insertally link elements
        gstreamer-plugins-base-1.0 GStreamer Base Plugins Libraries - Streaming media framework, base plugins libraries
        gstreamer-codecparsers-1.0 GStreamer codec parsers - Bitstream parsers for GStreamer elements
        gstreamer-base-1.0         GStreamer base classes - Base classes for GStreamer elements
        gstreamer-app-1.0          GStreamer Application Library - Helper functions and base classes for application integration
        gstreamer-webrtc-1.0       GStreamer WebRTC - GStreamer WebRTC support
        gstreamer-check-1.0        GStreamer check unit testing - Unit testing helper library for GStreamer modules
        gstreamer-controller-1.0   GStreamer controller - Dynamic parameter control for GStreamer elements
        gstreamer-video-1.0        GStreamer Video Library - Video base classes and helper functions
        gstreamer-sctp-1.0         GStreamer SCTP Library - SCTP helper functions
        gstreamer-fft-1.0          GStreamer FFT Library - FFT implementation
        gstreamer-mpegts-1.0       GStreamer MPEG-TS - GStreamer MPEG-TS support
        gstreamer-pbutils-1.0      GStreamer Base Utils Library - General utility functions
        gstreamer-rtp-1.0          GStreamer RTP Library - RTP base classes and helper functions
        gstreamer-rtsp-1.0         GStreamer RTSP Library - RTSP base classes and helper functions
        gstreamer-riff-1.0         GStreamer RIFF Library - RIFF helper functions
        gstreamer-audio-1.0        GStreamer Audio library - Audio helper functions and base classes
        gstreamer-plugins-bad-1.0  GStreamer Bad Plugin libraries - Streaming media framework, bad plugins libraries
        gstreamer-rtsp-server-1.0  gst-rtsp-server - GStreamer based RTSP server
        

        and glib:

        C:\Users\vivoh>C:\gstreamer\1.0\x86_64\bin\pkg-config.exe --list-all | findstr glib
        gio-2.0                    GIO - glib I/O library
        glib-2.0                   GLib - C Utility Library
        json-glib-1.0              JSON-GLib - JSON Parser for GLib.
        libsoup-2.4                libsoup - a glib-based HTTP library
        taglib                     TagLib - Audio meta-data library
        gio-windows-2.0            GIO Windows specific APIs - Windows specific headers for glib I/O library
        
        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Since you are using the full path to the executable, did you modify the PATH environment variable in the Build part of the Project panel so that it can be found by qmake ?

          Did you also try it set the PKG_CONFIG_PATH environment variable ?

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • erikherzE Offline
            erikherzE Offline
            erikherz
            wrote on last edited by
            #5

            This is what I now have. Please suggest the value for the PKG_CONFIG_PATH variable. Also please confirm that I should be doing with this with Gstreamer MinGW-64. Finally, please help me understand why Windows is asking for this: "Project ERROR: gstreamer-1.0 development package not found" while it builds fine on MacOS. It looks like they have the same pkg-config gstreamer libs.

            Thank you!

            one.png
            two.png three.png four.png

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #6

              @erikherz said in Building with Gstreamer on Windows:

              PKG_CONFIG_PATH

              should contain paths to folder containing .pc files.

              Just an educated guess but pkg-config was likely not developed with Windows in mind when it was released.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • erikherzE Offline
                erikherzE Offline
                erikherz
                wrote on last edited by erikherz
                #7

                OK. I found it here:
                C:>dir "C:" /s /b /d | find ".pc"
                ...
                C:\gstreamer\1.0\x86_64\lib\pkgconfig\x264.pc
                C:\gstreamer\1.0\x86_64\lib\pkgconfig\zlib.pc
                ... etc
                and set it here but got the same error:
                ..set_path.png

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  Did you also modify the PATH environment variable so that pkg-config can be found by Qt Creator ?

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  0
                  • erikherzE Offline
                    erikherzE Offline
                    erikherz
                    wrote on last edited by
                    #9

                    Done. Same error.
                    update_path.png

                    1 Reply Last reply
                    0
                    • erikherzE Offline
                      erikherzE Offline
                      erikherz
                      wrote on last edited by erikherz
                      #10

                      I did not build qt-gstreamer on any platform. It compiled as-is on Linux and MacOS with the Gstreamer installs but perhaps I need to build an install this as per this article?

                      https://forum.qt.io/topic/74652/building-qt-gstreamer

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        Path contains a folder list, not full executable path.

                        There's no need to build QtGstreamer which is deprecated by the way.

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        1
                        • erikherzE Offline
                          erikherzE Offline
                          erikherz
                          wrote on last edited by
                          #12

                          Path updated. Still no luck.
                          new_path.png

                          1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on last edited by
                            #13

                            Did you force a re-run of qmake after these modifications ?

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            1 Reply Last reply
                            0
                            • erikherzE Offline
                              erikherzE Offline
                              erikherz
                              wrote on last edited by
                              #14

                              According to this article, yes:
                              https://forum.qt.io/topic/34055/how-does-qtcreator-know-when-to-re-run-qmake/5

                              I re-started QT Creator and made a point of changing the .pro file. It re-parse and reset.

                              ... same error.

                              1 Reply Last reply
                              0
                              • erikherzE Offline
                                erikherzE Offline
                                erikherz
                                wrote on last edited by
                                #15

                                I did a clean install of QT Creator with the MSVC Gstreamer installers and got past that initial error. Now my error is in the Gstreamer integration code. I consider this progress!
                                Screen Shot 2020-03-13 at 9.40.18 AM.png

                                1 Reply Last reply
                                0
                                • erikherzE Offline
                                  erikherzE Offline
                                  erikherz
                                  wrote on last edited by
                                  #16

                                  Making some progress. Now it is compiling after I added:

                                  LIBS += -lgstvideo-1.0

                                  Now we are trying to get gstreamer to find its own plugins:

                                  14:31:17: Starting C:\GIT\build-slim-Desktop_Qt_5_14_1_MinGW_64_bit-Debug\slim.exe ...

                                  (slim.exe:4476): GStreamer-WARNING **: 14:31:24.371: Failed to load plugin 'C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\gstopenh264.dll': 'C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\gstopenh264.dll': The specified procedure could not be found.

                                  (slim.exe:4476): GStreamer-WARNING **: 14:31:25.826: Failed to load plugin 'C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\gstsrt.dll': 'C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\gstsrt.dll': The specified procedure could not be found.
                                  WARNING: no real random source present!
                                  14:31:30: C:\GIT\build-slim-Desktop_Qt_5_14_1_MinGW_64_bit-Debug\slim.exe exited with code 1

                                  1 Reply Last reply
                                  0
                                  • erikherzE Offline
                                    erikherzE Offline
                                    erikherz
                                    wrote on last edited by
                                    #17

                                    This does the trick for making sure that Gstreamer finds its own plugins:
                                    gstreamer_plugins.png

                                    1 Reply Last reply
                                    1
                                    • erikherzE Offline
                                      erikherzE Offline
                                      erikherz
                                      wrote on last edited by
                                      #18

                                      Also here is my win32 block in my .pro file for reference:

                                      win32 {
                                          INCLUDEPATH += \
                                                         c:\gstreamer\1.0\x86_64\include \
                                                         c:\gstreamer\1.0\x86_64\lib\gstreamer-1.0\include \
                                                         c:\gstreamer\1.0\x86_64\include\gstreamer-1.0 \
                                                         c:\gstreamer\1.0\x86_64\include\glib-2.0 \
                                                         c:\gstreamer\1.0\x86_64\include\glib-2.0\glib \
                                                         c:\gstreamer\1.0\x86_64\include\glib-2.0\include
                                      
                                      
                                          DEPENDPATH += c:\gstreamer\1.0\x86_64\lib
                                      
                                          LIBS += -Lc:\gstreamer\1.0\x86_64\lib
                                          LIBS += c:\gstreamer\1.0\x86_64\lib\glib-2.0.lib
                                          LIBS += -lglib-2.0 -lwinpthread -lgstreamer-1.0 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0
                                          LIBS += -lgstvideo-1.0
                                      
                                          CONFIG += c:\gstreamer\1.0\x86_64\lib\pkgconfig
                                      }
                                      
                                      1 Reply Last reply
                                      1
                                      • SGaistS Offline
                                        SGaistS Offline
                                        SGaist
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #19

                                        Looks like pkg-config did not work correctly but still... the manual way did work !

                                        Glad you found a way and thanks for sharing !

                                        Interested in AI ? www.idiap.ch
                                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        1 Reply Last reply
                                        0
                                        • erikherzE Offline
                                          erikherzE Offline
                                          erikherz
                                          wrote on last edited by
                                          #20

                                          Also for Windows, I needed to use d3dvideosink or autovideosink rather than glimagesink

                                          It builds and renders the Gstreamer sample video.

                                          Now my issue is getting it to stay within the application window rather than popping out into its own new window.

                                          I got this error:

                                          ** (slim_qt.exe:5908): CRITICAL **: 16:15:15.218: gst_video_overlay_set_window_handle: assertion 'overlay != NULL' failed
                                          

                                          So I added:

                                              qDebug() << "slim_qt:gst() xwinid = " + QVariant(xwinid).toString();
                                          

                                          and got this:

                                          "slim_qt:gst() xwinid = 1770362"
                                          

                                          So I am wondering why gst_video_overlay_set_window_handle failed.

                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved