Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Building with Gstreamer on Windows



  • 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);
    }
    
    
    
    

  • Lifetime Qt Champion

    Hi and welcome to devnet,

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



  • 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
    

  • Lifetime Qt Champion

    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 ?



  • 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


  • Lifetime Qt Champion

    @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.



  • 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


  • Lifetime Qt Champion

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



  • Done. Same error.
    update_path.png



  • 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


  • Lifetime Qt Champion

    Path contains a folder list, not full executable path.

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



  • Path updated. Still no luck.
    new_path.png


  • Lifetime Qt Champion

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



  • 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.



  • 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



  • 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



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



  • 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
    }
    

  • Lifetime Qt Champion

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

    Glad you found a way and thanks for sharing !



  • 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.


  • Lifetime Qt Champion

    You might want to take a look at the GStreamer backend plugin. With recent versions of Qt you can build custom pipelines and make them output to a Qt video widget naming the sink properly.



  • I would love to learn more about that. May I have a pointer to a doc? A quick search did not turn up an obvious resource for me.



  • I got it to land in the QWidget. The trick was to call .show() before calling winId().

    Here is the final .pro:

    QT       += core gui multimediawidgets
    
    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
        LIBS += -lgstvideo-1.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
    
    

    and main.cpp:

    #include <QApplication>
    #include <QFrame>
    #include <QTimer>
    #include <QDebug>
    #include <QLabel>
    #include <QWidget>
    #include <QVBoxLayout>
    #include <gst/gst.h>
    #include <QtDebug>
    
    #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[]) {
    
       gst_init (&argc, &argv);
       QApplication app(argc, argv);
       app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit ()));
    
    
       // prepare the pipeline
       /*
          GstElement *pipeline =
                  gst_parse_launch
                  (
                      "videotestsrc is-live=true ! d3dvideosink",
                  NULL);
           GstElement *sink  =  gst_bin_get_by_name(GST_BIN(pipeline), "sink");
       */
    
          GstElement *pipeline = gst_pipeline_new ("xvoverlay");
          GstElement *src = gst_element_factory_make ("videotestsrc", NULL);
          GstElement *sink = gst_element_factory_make ("d3dvideosink", NULL);
          gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
          gst_element_link (src, sink);
    
    
          // prepare the ui
    
       QWidget window;
    
       QLabel *label = new QLabel("Hi");
       QWidget *widget = new QWidget();
    
        QVBoxLayout qboxLayout;
        qboxLayout.addWidget(label);
        qboxLayout.addWidget(widget);
        window.setLayout(&qboxLayout);
    
        window.resize(320, 240);
        window.show();
    
    
            WId xwinid = widget->winId();
            qDebug() << "slim_qt:gst() xwinid = " + QVariant(xwinid).toString();
    
            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()));
       }
    
       app.exec();
    
    }
    
    int main(int argc, char *argv[])
    {
        gst(argc, argv);
        return true;
    }
    

    and project build ENV settings:

    Set GSL_PLUGIN_PATH to C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0
    Set GSTREAMER_INCDIR to C:\gstreamer\1.0\x86_64\include\gstreamer-1.0
    Set GSTREAMER_LIBDIR to C:\gstreamer\1.0\x86_64\lib
    Set PKG_CONFIG_PATH to C:\gstreamer\1.0\x86_64\lib\pkgconfig\
    
    Add to Path: C:\gstreamer\1.0\x86_64\bin\
    

  • Lifetime Qt Champion

    QMediaPlayer::setMedia for thé documentation itself.

    You might even be able just build the GStreamer backend and use it directly.



  • I thought that QMediaPlayer used native AV Foundations (Windows Media Foundation for Windows, AV Foundation for MacOS, and GStreamer for Linux) ... does this mean that I can now use a gst-pipeline source for QMediaPlayer in an App on Windows or Mac?


  • Lifetime Qt Champion

    QMediaPlayer does not do anything directly. It uses the various plugins. Each platform has its corresponding plugin using native technologies. However nothing forbids you to provide additional plugins like for example for network cameras. So if you manage to build the GStreamer plugin, using it should also be possible.



  • Got it. Thank you!



  • I spoke too soon. I do have the application building but video is not yet playing. I was told that the issue may be because I am using MinGW rather than MSVC. I was able to trim down a sample application which I thought that I should share in case anyone else wants to give this a try. I see the video test pattern when I build it from QT Creator but not when I deploy it as a stand alone application. If you are able to see the test pattern as a stand alone application, please post here how you got it working. Thank you!

    mini.pro:

    TEMPLATE = app
    TARGET = videoapp
    
    QT += multimedia multimediawidgets network widgets core gui
    
    CONFIG += link_pkgconfig
    
    PKGCONFIG += gstreamer-1.0 \
            glib-2.0 \
            gobject-2.0 \
            gio-2.0 \
            gstreamer-video-1.0 \
            gstreamer-audio-1.0
    
    linux {
    #    PKGCONFIG += gstvideo-1.0
        LIBS += -L/usr/lib/i386-linux-gnu/ -lgstvideo-1.0
        # I don't think you need the INCLUDEPATH below if pkg-config is working correctly
        INCLUDEPATH += \
            /usr/include/gstreamer-1.0 \
            /usr/include/glib-2.0/ \
            /usr/lib/x86_64-linux-gnu/glib-2.0/include/
    }
    
    mac {
        PKG_CONFIG = /usr/local/bin/pkg-config
        PKGCONFIG += gstreamer-video-1.0 gstreamer-audio-1.0
    }
    
    win32 {
    ## - Everything is set in the QT Project Build ENV, including:
    #Set GSL_PLUGIN_PATH to C:\gstreamer\1.0\x86_64\lib\gstreamer-1.0
    #Set GSTREAMER_INCDIR to C:\gstreamer\1.0\x86_64\include\gstreamer-1.0
    #Set GSTREAMER_LIBDIR to C:\gstreamer\1.0\x86_64\lib
    #Add this to Path: C:\gstreamer\1.0\x86_64\bin\
    }
    
    HEADERS =
    
    SOURCES = \
        main.cpp
    

    main.cpp:

    #include <QApplication>
    #include <QTimer>
    #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[]) {
    
       gst_init (&argc, &argv);
       QApplication app(argc, argv);
       app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit ()));
    
       QString videosinkStr, audiosinkStr, pipelinestr;
       GstElement *m_pipeline, *sink;
    
       #ifdef _WIN32 // TODO: any difference on videosink definition between _WIN32 and _WIN64?
           videosinkStr = "d3dvideosink"; // test: dshowvideosink, d3dvideosink, directsoundsink
           audiosinkStr = "volume ! directsoundsink";
       #endif
       #ifdef __APPLE__
       #ifdef TARGET_OS_MAC
           videosinkStr = "glimagesink"; // also test: osxvideosink, osxaudiosink
           audiosinkStr = "volume ! osxaudiosink";
    
       #endif
       #endif
       #ifdef __linux__
           videosinkStr = "xvimagesink"; // ximagesink is a winner on my PopOS machine!
           //also test: ximagesink, xvimagesink, alsasink, pulsesink
           audiosinkStr = "volume ! alsasink";
       #endif
    
        pipelinestr = "videotestsrc ! "+videosinkStr+"  name=video_out";
    
        m_pipeline = gst_parse_launch (pipelinestr.toStdString().c_str(), NULL );
        sink  =  gst_bin_get_by_name(GST_BIN(m_pipeline), "video_out");
    
        QWidget window;
    
        QLabel *label = new QLabel("Video Test Pattern");
        QWidget *widget = new QWidget();
        widget->setFixedSize(640,360);
        WId xwinid = widget->winId();
        gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), guintptr(xwinid));
    
        QVBoxLayout qboxLayout;
        qboxLayout.addWidget(label);
        qboxLayout.addWidget(widget);
        window.setLayout(&qboxLayout);
    
        window.resize(660, 380);
        window.show();
    
       // run the pipeline
    
       GstStateChangeReturn sret = gst_element_set_state (m_pipeline,
           GST_STATE_PLAYING);
       if (sret == GST_STATE_CHANGE_FAILURE) {
         gst_element_set_state (m_pipeline, GST_STATE_NULL);
         gst_object_unref (m_pipeline);
         // Exit application
         QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
       }
    
       app.exec();
    
    }
    
    int main(int argc, char *argv[])
    {
        gst(argc, argv);
        return true;
    }
    

  • Lifetime Qt Champion

    Did you deploy your application using windeployqt ?



  • Yes. It still needed the Gstreamer libs, so I copied all of those too. It also complained of other libs missing so I copied those as needed from the system until the application ran. Now it runs but video does not play. I suspect that this may be the mysterious issue with MinGW.



  • I received some useful Gstreamer debugging information on this forum post:
    http://gstreamer-devel.966125.n4.nabble.com/How-to-debug-Gstreamer-on-Windows-td4693738.html



  • OK. I got it to work by switching to MSVC, creating a plugins directory, setting a Gstreamer ENV to that path, like so: set GST_PLUGIN_PATH=C:\Users\vivoh\Desktop\mini\plugins, and dropping in the two required plugins, in this case: gstvideotestsrc.dll and gstd3d.dll


Log in to reply