Qt Multimedia GStreamer-Backend
Diese Seite behandelt die Einschränkungen des GStreamer-Backends von Qt Multimedia.
Beschränkungen und bekannte Probleme
GStreamer ist nicht mit Qt gebündelt, sondern wird normalerweise mit der Linux-Distribution bereitgestellt.
- 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.
- Seeking, Wiedergaberaten, Schleife, Umschalten von Senken haben bekannte Fehler.
Anpassungspunkte
Qt Multimedia bietet bestimmte Anpassungspunkte, um den Zugriff auf die zugrunde liegende GStreamer-Pipeline zu ermöglichen. Diese Anpassungspunkte werden als private APIs betrachtet und können Änderungen unterliegen. Der Einstiegspunkt ist class QGStreamerPlatformSpecificInterface
.
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 immer noch von der Qt-Implementierung verwaltet wird. Bei der Verwendung dieser API ist große Vorsicht geboten.
#include <QtMultimedia/private/qgstreamer_platformspecificinterface_p.h> [...] QMediaMediaPlayer player; GstPipeline *pipeline = QGStreamerPlatformSpecificInterface::instance()->gstPipeline(&player); [...] QMediaCaptureSession session; GstPipeline *pipeline = QGSreamerPlatformSpecificInterface::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 zeichnen wollen, kann GStreamer's qml6glsink
(siehe unten) eine robustere Wahl sein.
Architektonische Überlegungen.
Qt Multimedia ist kein Allzweck-Streaming-Framework und nicht unbedingt der architektonisch beste Weg, 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.
© 2025 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.