Building with Gstreamer on Windows
-
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 ?
-
wrote on 11 Mar 2020, 20:29 last edited by
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.
-
wrote on 11 Mar 2020, 20:54 last edited by erikherz 3 Nov 2020, 20:59
-
Did you also modify the PATH environment variable so that
pkg-config
can be found by Qt Creator ? -
wrote on 11 Mar 2020, 21:08 last edited by
-
wrote on 11 Mar 2020, 21:31 last edited by erikherz 3 Nov 2020, 21:32
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.
-
wrote on 12 Mar 2020, 00:08 last edited by
-
Did you force a re-run of qmake after these modifications ?
-
wrote on 12 Mar 2020, 22:57 last edited by
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.
-
wrote on 13 Mar 2020, 13:45 last edited by
-
wrote on 13 Mar 2020, 14:58 last edited by
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 -
wrote on 13 Mar 2020, 15:13 last edited by
-
wrote on 13 Mar 2020, 19:14 last edited by
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 !
-
wrote on 14 Mar 2020, 16:29 last edited by
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.
-
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.
-
wrote on 14 Mar 2020, 19:55 last edited by
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.
-
wrote on 14 Mar 2020, 19:58 last edited by erikherz
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\
13/32