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, hauptsächlich weil es das Framework ist, das die meisten Embedded-Board-Anbieter für hardwarebeschleunigte Medienunterstützung bevorzugen. FFmpeg kann auf einigen Plattformen ebenfalls geeignet sein, so dass Benutzer ermutigt werden, 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 der architektonisch beste Weg, um GStreamer mit Qt zu verwenden. Entwickler, die ein hohes Maß an Kontrolle über die GStreamer-Pipeline benötigen, aber nur die Videoausgabe in Qt anzeigen möchten, sollten die Verwendung von GStreamer's qml6glsink in Betracht ziehen.
Beschränkungen und bekannte Probleme
GStreamer ist nicht mit Qt gebündelt, wird aber normalerweise mit der Linux-Distribution ausgeliefert.
- Bestimmte Fehler können auf die verwendete GStreamer-Version zurückzuführen sein. Wir empfehlen die Verwendung der neuesten GStreamer-Fehlerbehebungsversion für Ihre Plattform.
- Bestimmte Fehler können auch mit den von GStreamer verwendeten Bibliotheken, wie Pulseaudio, zusammenhängen. Vor allem Pulseaudio v16 hat einen bekannten Fehler, der die GStreamer-Pipeline zum Hängen bringt, und erfordert Backports dieser beiden Patches:
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/745
- https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/764
Dieser Fehler betrifft derzeit die meisten Mainstream-Linux-Distributionen, einschließlich Ubuntu 22.04, 23.10 und 24.04, Debian 11 und 12, sowie Fedora 39 und 40.
- Das Umschalten von Kamerageräten oder Kameras während der Aufnahme wird nicht unterstützt
- Seeking, Wiedergaberaten, Schleife, Umschalten von Senken haben bekannte Bugs.
- Die Audiofunktionen erfordern PulseAudio. Siehe Linux-Plattform-Hinweise für Details.
- Einige eingebettete Boards benötigen individuelle Konfigurationen, um Pipeline-Aushandlungs-/Verknüpfungsprobleme zu lösen und die Leistung zu verbessern. Wir empfehlen Entwicklern, mit den unter Anpassungspunkte aufgeführten Umgebungsvariablen zu experimentieren, wenn solche Probleme auftreten. Die Yocto-Meta-Layer-Dateien von Qt enthalten empfohlene Konfigurationen für bestimmte Kombinationen von Boards, BSPs und Boot to Qt Versionen. Hier sind Links zu den Dev-Branch-Versionen:
- 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 NXP i.MX-Karten stellen ein v4l2-Gerät namens imx-capture zur Verfügung, das bei der Verwendung von v4l2src in GStreamer Fehler verursachen kann. Um Qt Multimedia daran zu hindern, imx-capture zur Liste der verfügbaren Kamerageräte hinzuzufügen, setzen Sie die Umgebungsvariable QT_GSTREAMER_SKIP_IMXCAPTURE=1. Beachten Sie, dass dies als private API betrachtet wird, die entfernt wird, wenn NXP die Probleme mit imx-capture behebt.
- Videowiedergabe oder Kamerastreaming unter Verwendung von Videoframes aus dem Systemspeicher oder Softwarekonvertierung kann zu Bildausfällen und Unempfindlichkeit aufgrund von hoher CPU-Last führen. Wenn der GStreamer-Decoder oder das Kameragerät DMA-BUF- oder GLMemory-gestützte Videoframes in einem der von uns 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. Verschiedene Möglichkeiten zur Steuerung, welche Elemente zur Pipeline hinzugefügt werden, sind unter Anpassungspunkte 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 class QGStreamerPlatformSpecificInterface. Zusätzliche Anpassungen können durch das Setzen von Umgebungsvariablen vorgenommen werden.
Achtung! Die hier aufgelisteten Anpassungspunkte und Qt-spezifischen Umgebungsvariablen werden als private APIs betrachtet und können Änderungen unterworfen sein. Beachten Sie, dass Umgebungsvariablen standardmäßig an Kindprozesse vererbt werden und unbeabsichtigte Folgen haben können.
Externes OpenGL-Textur-Rendering
Qt importiert DMA-BUF-unterstützte Videobilder in die OpenGL-Grafikpipeline, indem es den zugrunde liegenden Puffer als EGL-Bild bindet und es den Shadern als OpenGL-Textur zur Verfügung stellt. Standardmäßig tastet Qt diese Texturen mit dem GL_TEXTURE_2D-Texturziel und Standard-Shader-Code ab. Einige eingebettete Boards arbeiten stattdessen besser mit dem GL_TEXTURE_EXTERNAL_OES Textur-Target, zusammen mit einem dedizierten Fragment-Shader. Dieses Verhalten kann durch Setzen der folgenden Umgebungsvariablen aktiviert werden:
QT_MULTIMEDIA_FORCE_GL_TEXTURE_EXTERNAL_OES=1
Festlegen des E/A-Modus für v4l2-Kameras
Bei der Verwendung eines v4l2-Erfassungsgeräts mit einer QCamera - oder QML-Kamera beeinflusst die io-mode-Eigenschaft des zugrundeliegenden v4l2src-GStreamer-Elements, ob es DMA-BUF-gespeicherte Videoframes ausgibt, die ein Zero-Copy-Rendering ermöglichen oder nicht. In einigen Fällen wählt der Standard-Automodus den mmap-Modus, obwohl der Kameratreiber den dmabuf-Modus unterstützt. Der Wert der Eigenschaft io-mode int kann explizit über die unten stehende Umgebungsvariable gesetzt werden. Hier ist ein Beispiel, das zeigt, wie man den io-mode mit dem enum GST_V4L2_IO_DMABUF auf dmabuf setzt:
QT_GSTREAMER_V4L2SRC_IOMODE=4
Auswählen bestimmter GStreamer-Elemente
Eine GStreamer-Distribution kann mehrere verschiedene Plugins enthalten, die potenziell die gleiche Aufgabe in der Medien-Pipeline übernehmen können. GStreamer wählt Elemente wie Decoder und Demuxer automatisch auf der Grundlage ihres Funktionsrangs aus, der über eine GStreamer-Umgebungsvariable überschrieben werden kann. Hier ein Beispiel, das den Hardware-Decoder v4l2h264dec höher einstuft als jeden H.264-Software-Decoder und gleichzeitig sicherstellt, dass der Demuxer aiurdemux nicht ausgewählt ist:
GST_PLUGIN_FEATURE_RANK=v4l2h264dec:MAX,aiurdemux:NONE
Um zu überprüfen, welche Elemente während der Laufzeit erstellt werden, aktivieren Sie die Debug-Protokollierungsstufe 4 für GstElementFactory:
GST_DEBUG=GST_ELEMENT_FACTORY:4
Darüber hinaus können Sie die gesamte GStreamer-Pipeline visuell inspizieren, indem Sie einen Ordner für .dot Grafikdateien angeben, die bei verschiedenen Ereignissen, z. B. bei Änderungen des Wiedergabezustands, ausgegeben werden:
GST_DEBUG_DUMP_DOT_DIR=/root/graphs
Lesen Sie mehr über diese Umgebungsvariablen in der GStreamer-Dokumentation:
- Umgebungsvariablen - GST_PLUGIN_FEATURE_RANK
- Grundlegendes Tutorial - Das Debug-Protokoll
- Grundlegendes Tutorial - Abrufen von Pipeline-Diagrammen
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, es sei denn, sie enthält ein geeignetes hardwarebeschleunigtes Videokonvertierungselement. Um ein zu verwendendes Hardware-Konvertierungselement anzugeben, setzen Sie es als GStreamer-Pipeline-Beschreibung auf die folgende Umgebungsvariable:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT
Einige herstellerspezifische Konvertierungselemente (imxvideoconvert_g2d, nvvidconv) werden der Pipeline standardmäßig hinzugefügt, wenn sie verfügbar sind. Dies kann zu unnötigen Konvertierungen führen, wenn sie nicht benötigt werden, und kann durch Angabe eines GStreamer-Identitätselements unter Verwendung derselben Umgebungsvariablen deaktiviert werden:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=identityGStreamer kann auch Formatkonvertierungen mit OpenGL-Elementen durchführen und Qt mit GLMemory-gestützten Videoframes versorgen:
QT_GSTREAMER_OVERRIDE_VIDEO_CONVERSION_ELEMENT=glupload ! glcolorconvert
Roher Pipeline-Zugriff
Auf die GstPipeline, die den QMediaPlayer und QMediaCaptureSession zugrunde liegt, kann zugegriffen werden.
Warnung: Dies ist eine unsichere API, da die Pipeline noch von der Qt-Implementierung verwaltet wird. Bei der Verwendung dieser API ist große Vorsicht geboten.
#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h> [...] QMediaPlayer player; GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&player); [...] QMediaCaptureSession session; GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&session);
Benutzerdefinierte GStreamer-Elemente als Senken und Quellen
Es ist möglich, GStreamer-Elemente aus einer GStreamer-Pipeline-Beschreibung zu erstellen und sie in eine QCamera oder QAudioDevice zu verpacken:
#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h> [...] QByteArray pipelineString = "videotestsrc is-live=true ! gamma gamma=2.0"; QMediaCaptureSession session; session.setVideoSink(wid.videoSink()); QCamera *cam = QGStreamerPlatformSpecificInterface::instance()->makeCustomGStreamerCamera( pipelineString, &session); session.setCamera(cam);
QMediaPlayer: Benutzerdefinierte Quellen
Die QMediaPlayer akzeptiert eine GStreamer-Pipeline-Beschreibung als Quell-URI:
QMediaPlayer player; player.setSource(u"gstreamer-pipeline: videotestsrc name=testsrc"_s);
Es wird versucht, die Pipeline-Beschreibung zu kompilieren, um sie als Quelle im QMediaPlayer zu verwenden, und 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 von QMediaPlayer abbilden, vor allem nicht auf den Medienstatus, die Metadaten-APIs und den Transportstatus. 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: nicht die richtige Wahl für den Anwendungscode: Für beliebige Videoquellen ist die QMediaCaptureSession mit einer benutzerdefinierten Kamera (siehe oben) die bevorzugte Wahl. Für beliebig komplexe Pipelines, die nur in eine Qt/QML GUI gezeichnet werden sollen, kann GStreamer's qml6glsink (siehe unten) eine robustere Wahl sein.
© 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.