Qt Multimedia GStreamer-Backend
Diese Seite behandelt Einschränkungen und Anpassungsmöglichkeiten des GStreamer-Backends von Qt Multimedia, dem Standard-Medien-Backend unter Embedded-Linux.
Architektonische Überlegungen
GStreamer ist das Standard-Medien-Backend unter Embedded-Linux, vor allem weil es das Framework ist, das die meisten Hersteller von Embedded-Boards für die hardwarebeschleunigte Medienunterstützung bevorzugen. FFmpeg kann auf manchen Plattformen ebenfalls geeignet sein; daher wird den Benutzern empfohlen, mit beiden Medien-Backends zu experimentieren, um herauszufinden, welches für sie am besten funktioniert.
Qt Multimedia ist kein universelles Streaming-Framework und nicht unbedingt die architektonisch beste Lösung für die Verwendung von GStreamer mit Qt. Entwickler, die ein hohes Maß an Kontrolle über die GStreamer-Pipeline benötigen, die Videoausgabe jedoch nur mit Qt anzeigen möchten, sollten die Verwendung von GStreamers `qml6glsink` in Betracht ziehen.
Einschränkungen und bekannte Probleme
GStreamer ist nicht im Lieferumfang von Qt enthalten, wird jedoch in der Regel mit der Linux-Distribution bereitgestellt.
- Bestimmte Fehler können auf die verwendete GStreamer-Version zurückzuführen sein. Wir empfehlen, die aktuellste Bugfix-Version von GStreamer für Ihre Plattform zu verwenden.
- Bestimmte Fehler können auch mit den von GStreamer verwendeten Bibliotheken zusammenhängen, wie beispielsweise Pulseaudio. Insbesondere Pulseaudio v16 weist einen bekannten Fehler auf, der zum Absturz der GStreamer-Pipeline führt und Backports dieser beiden Patches erfordert:
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/745
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/764
Dieser Fehler betrifft derzeit die meisten gängigen Linux-Distributionen, darunter Ubuntu 22.04, 23.10 und 24.04, Debian 11 und 12 sowie Fedora 39 und 40.
- Das Wechseln von Kamerageräten oder Kameras während der Aufnahme wird nicht unterstützt
- Bei der Positionssprungfunktion, den Wiedergaberaten, der Schleifenwiedergabe und dem Wechseln der Ausgabegeräte sind Fehler bekannt.
- Für Audiofunktionen ist PulseAudio erforderlich. Weitere Informationen finden Sie in den Hinweisen zur Linux-Plattform.
- Einige Embedded-Boards erfordern individuelle Konfigurationen, um Probleme bei der Pipeline-Aushandlung/-Verknüpfung zu beheben und die Leistung zu verbessern. Wir empfehlen Entwicklern, bei solchen Problemen mit den unter „Anpassungsmöglichkeiten“ aufgeführten Umgebungsvariablen zu experimentieren. Die Yocto-Meta-Layer-Dateien von Qt enthalten empfohlene Konfigurationen für bestimmte Kombinationen aus Boards, BSPs und „ Boot to Qt “-Versionen. Hier sind die Links zu den Versionen im Dev-Branch:
- NXP i.MX 6/8/9: https://code.qt.io/cgit/yocto/meta-boot2qt.git/tree/meta-boot2qt-distro/dynamic-layers/freescale-layer/recipes-qt/boot2qt-addons/default-qt-envs.bbappend?h=dev
- Raspberry Pi 4/5: https://code.qt.io/cgit/yocto/meta-boot2qt.git/tree/meta-boot2qt-distro/dynamic-layers/raspberrypi/recipes-qt/boot2qt-addons/default-qt-envs.bbappend?h=dev
- Einige i.MX-Boards von NXP stellen ein v4l2-Gerät namens „imx-capture“ bereit, was bei Verwendung mit v4l2src in GStreamer zu Fehlern führen kann. Um zu verhindern, dass Qt Multimedia „imx-capture“ zur Liste der verfügbaren Kamerageräte hinzufügt, setzen Sie die Umgebungsvariable QT_GSTREAMER_SKIP_IMXCAPTURE=1. Beachten Sie, dass dies als private API gilt, die entfernt wird, sobald NXP die Probleme mit „imx-capture“ behebt.
- Die Videowiedergabe oder das Kamera-Streaming unter Verwendung von Videobildern aus dem Systemspeicher oder mittels Softwarekonvertierung kann aufgrund hoher CPU-Auslastung zu Bildausfällen und Reaktionsverzögerungen führen. Wenn der GStreamer-Decoder oder das Kameragerät DMA-BUF- oder GLMemory-gestützte Videobilder in einem unserer unterstützten Pixelformate ausgibt, kann Qt diese ohne zusätzliche Konvertierung oder Kopieren rendern. GStreamer wählt ein Format und einen Speichertyp basierend auf den Fähigkeiten seiner Pipeline-Elemente aus. Verschiedene Möglichkeiten zur Steuerung, welche Elemente der Pipeline hinzugefügt werden, werden unter „Anpassungsmöglichkeiten“ beschrieben. Siehe auch „Festlegen des E/A-Modus für v4l2-Kameras“.
Anpassungspunkte
Qt Multimedia bietet bestimmte Anpassungspunkte, um den Zugriff auf die zugrunde liegende GStreamer-Pipeline zu ermöglichen. Der Einstiegspunkt ist ` QGStreamerInterface`. Weitere Anpassungen können durch das Setzen von Umgebungsvariablen vorgenommen werden.
Warnung: Die hier aufgeführten Anpassungspunkte und Qt-spezifischen Umgebungsvariablen gelten als private APIs und können sich ändern. Beachten Sie, dass Umgebungsvariablen standardmäßig von untergeordneten Prozessen geerbt werden und unbeabsichtigte Folgen haben können.
Externes OpenGL-Textur-Rendering
Qt importiert DMA-BUF-gestützte Videobilder in die OpenGL-Grafikpipeline, indem es den zugrunde liegenden Puffer als EGL-Bild bindet und ihn den Shadern als OpenGL-Textur zur Verfügung stellt. Standardmäßig sampelt Qt diese Texturen unter Verwendung des Texturziels GL_TEXTURE_2D und Standard-Shader-Code. Einige Embedded-Boards erzielen stattdessen mit dem Texturziel GL_TEXTURE_EXTERNAL_OES in Verbindung mit einem dedizierten Fragment-Shader eine bessere Leistung. Dieses Verhalten kann durch Setzen der folgenden Umgebungsvariable aktiviert werden:
QT_MULTIMEDIA_FORCE_GL_TEXTURE_EXTERNAL_OES=1Festlegen des E/A-Modus für v4l2-Kameras
Bei der Verwendung eines v4l2-Aufnahmegeräts mit einer „ QCamera “ oder einer QML-Kamera bestimmt die Eigenschaft „io-mode“ des zugrunde liegenden GStreamer-Elements „v4l2src“, ob DMA-BUF-gestützte Videobilder ausgegeben werden, die ein Zero-Copy-Rendering ermöglichen. In einigen Fällen wählt der standardmäßige „auto“-Modus den „mmap“-Modus, obwohl der Kameratreiber den „dmabuf“-Modus unterstützt. Der Integer-Wert der Eigenschaft „io-mode“ kann explizit über die unten angegebene Umgebungsvariable gesetzt werden. Hier ist ein Beispiel, das zeigt, wie man „io-mode“ mit der Enumeration „GST_V4L2_IO_DMABUF“ auf „dmabuf“ setzt:
QT_GSTREAMER_V4L2SRC_IOMODE=4Auswahl bestimmter GStreamer-Elemente
Eine GStreamer-Distribution kann mehrere verschiedene Plugins enthalten, die potenziell dieselbe Aufgabe in der Medienpipeline ausführen können. GStreamer wählt Elemente wie Decoder und Demuxer automatisch anhand ihres Feature-Rangs aus, der jedoch über eine GStreamer-Umgebungsvariable überschrieben werden kann. Hier ist ein Beispiel, bei dem der Hardware-Decoder „v4l2h264dec“ höher eingestuft wird als jeder H.264-Software-Decoder, während gleichzeitig sichergestellt wird, dass der Demuxer „aiurdemux“ nicht ausgewählt wird:
GST_PLUGIN_FEATURE_RANK=v4l2h264dec:MAX,aiurdemux:NONEUm zu überprüfen, welche Elemente zur Laufzeit erstellt werden, aktivieren Sie die Debug-Protokollierungsstufe 4 für GstElementFactory:
GST_DEBUG=GST_ELEMENT_FACTORY:4Darüber hinaus können Sie die gesamte GStreamer-Pipeline visuell überprüfen, indem Sie einen Ordner für „ .dot “-Graph-Dateien angeben, die bei verschiedenen Ereignissen – beispielsweise bei Änderungen des Wiedergabestatus – ausgegeben werden:
GST_DEBUG_DUMP_DOT_DIR=/root/graphsWeitere Informationen zu diesen Umgebungsvariablen finden Sie in der GStreamer-Dokumentation:
- Umgebungsvariablen – GST_PLUGIN_FEATURE_RANK
- Einfaches Tutorial – Das Debug-Protokoll
- Einführung – Pipeline-Diagramme abrufen
Festlegen von Hardware-Konvertierungselementen
Wenn die Medienquelle einer GStreamer-Pipeline keine Videopuffer in einem von Qt Multimedia unterstützten Pixelformat bereitstellen kann, verwendet die Pipeline eine Softwarekonvertierung, sofern sie kein geeignetes hardwarebeschleunigtes Videokonvertierungselement enthält. Um ein zu verwendendes Hardware-Konvertierungselement festzulegen, setzen Sie es als GStreamer-Pipeline-Beschreibung in der folgenden Umgebungsvariablen:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENTEinige herstellerspezifische Konvertierungselemente (imxvideoconvert_g2d, nvvidconv) werden standardmäßig zur Pipeline hinzugefügt, sofern sie verfügbar sind. Dies kann zu unnötigen Konvertierungen führen, wenn sie nicht benötigt werden, und lässt sich durch die Angabe eines GStreamer-Identitätselements über dieselbe Umgebungsvariable deaktivieren:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=identityGStreamer kann Formatkonvertierungen auch mit OpenGL-Elementen durchführen und Qt so mit GLMemory-gestützten Videobildern versorgen:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=glupload ! glcolorconvertDirekter Zugriff auf die Pipeline
Auf die „ GstPipeline “, die den „ QMediaPlayer “ und „ QMediaCaptureSession “ zugrunde liegt, kann zugegriffen werden.
Warnung: Dies ist eine unsichere API, da die Pipeline weiterhin von der Qt-Implementierung verwaltet wird. Bei der Verwendung dieser API ist größte Vorsicht geboten.
#include <QtMultimedia/spi/qgstreamerinterface.h>
[...]
QMediaPlayer player;
GstPipeline *pipeline = QGStreamerInterface::instance()->gstPipeline(&player);
[...]
QMediaCaptureSession session;
GstPipeline *pipeline = QGStreamerInterface::instance()->gstPipeline(&session);Benutzerdefinierte GStreamer-Elemente als Senken und Quellen
Es ist möglich, GStreamer-Elemente aus einer GStreamer-Pipeline-Beschreibung zu erstellen und diese in einen ` QGStreamerVideoSource ` oder ` QAudioDevice` einzubinden:
#include <QtMultimedia/spi/qgstreamerinterface.h>
#include <QtMultimedia/spi/qgstreamervideosource.h>
[...]
QMediaCaptureSession session;
session.setVideoSink(wid.videoSink());
QGStreamerVideoSource videoSource(QStringLiteral("videotestsrc is-live=true ! gamma gamma=2.0"));
session.setNativeVideoSource(&videoSource);
videoSource.start();QMediaPlayer: benutzerdefinierte Quellen
Der ` QMediaPlayer ` akzeptiert eine GStreamer-Pipeline-Beschreibung als Quell-URI:
QMediaPlayer player;
player.setSource(u"gstreamer-pipeline: videotestsrc name=testsrc"_s);Dadurch wird versucht, die Pipeline-Beschreibung zu kompilieren, um sie als Quelle im „ QMediaPlayer “ zu verwenden, und sie wird automatisch mit den Senken des „ QMediaPlayer “ verbunden.
Warnung: Hic sunt dracones! Benutzerdefinierte Pipelines sind eine experimentelle Funktion: Die benutzerdefinierten Pipelines lassen sich nicht gut auf die APIs des „ QMediaPlayer “ abbilden, insbesondere was den Medienstatus, die Metadaten-APIs und den Transportstatus betrifft. Die meisten Aufrufe werden direkt auf die GStreamer-Pipeline abgebildet, was je nach Pipeline zu undefiniertem Verhalten führen kann. In den meisten Fällen ist die „ gstreamer-pipeline: “ möglicherweise nicht die richtige Wahl für Anwendungscode: Für beliebige Videoquellen ist der „ QMediaCaptureSession “ mit einer benutzerdefinierten Kamera (siehe oben) die bevorzugte Wahl. Für beliebig komplexe Pipelines, die lediglich in eine Qt GUI zeichnen sollen, ist GStreamers „ qml6glsink “ (siehe unten) möglicherweise die robustere Wahl.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.