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); }
-
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
-
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!
-
@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.
-
Did you also modify the PATH environment variable so that
pkg-config
can be found by Qt Creator ? -
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?
-
Path contains a folder list, not full executable path.
There's no need to build QtGstreamer which is deprecated by the way.
-
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/5I re-started QT Creator and made a point of changing the .pro file. It re-parse and reset.
... same error.
-
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 -
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 }
-
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.