FFmpeg-Stub-Bibliotheken unter Linux und Android
Überblick
Um das dynamische Linken von FFmpeg in Übereinstimmung mit der LGPL-Lizenz zu unterstützen, verwendet Qt Multimedia Stub-Bibliotheken, um optionale externe Abhängigkeiten auf Linux- und Android-Plattformen zu behandeln.
Auf diesen Plattformen kann FFmpeg zusätzliche gemeinsame Bibliotheken benötigen, die nicht mit Qt ausgeliefert werden:
- OpenSSL - erforderlich für sicheres Netzwerk-Streaming.
- VAAPI (nur Linux) - ermöglicht die hardwarebeschleunigte Videodekodierung und -kodierung.
Diese Bibliotheken sind oft nicht verfügbar oder können aufgrund von Lizenzbeschränkungen nicht gebündelt werden. Um sicherzustellen, dass FFmpeg-basierte Funktionen funktionsfähig bleiben (mit Ausnahme der nicht unterstützten Teile), liefert Qt Stub-Bibliotheken als Fallback.
Warum Stubs benötigt werden
Wenn diese Abhängigkeiten zur Laufzeit nicht vorhanden sind, wird FFmpeg nicht geladen oder funktioniert nicht richtig. Der Stub-Mechanismus ermöglicht dies:
- Erfolgreiches Laden von FFmpeg, auch wenn OpenSSL oder VAAPI fehlen.
- Graceful Degradation der Funktionalität (z. B. führt das Fehlen von VAAPI zu keiner Hardware-Beschleunigung, aber die Wiedergabe funktioniert trotzdem).
- Benutzer können sich für die Verwendung ihrer eigenen, vom System bereitgestellten Versionen dieser Bibliotheken entscheiden, falls verfügbar.
Was sind Stubs?
Stub-Bibliotheken ahmen die Schnittstellen der eigentlichen Bibliotheken nach (z. B. libssl.so
, libva.so
), implementieren aber nicht die volle Funktionalität. Stattdessen sind sie:
- Sie bieten Dummy-Implementierungen, die sichere Fallback-Werte oder No-ops zurückgeben.
- Sie versuchen dynamisch, echte Symbole über
QLibrary::load
/QLibrary::resolve
aufzulösen. - Sie scheitern, wenn echte Bibliotheken nicht gefunden werden.
Qt liefert diese Stubs unter den Namen:
libQt6FFmpegStub-ssl.so.x
libQt6FFmpegStub-crypto.so.x
libQt6FFmpegStub-va.so.x
libQt6FFmpegStub-va-drm.so.x
libQt6FFmpegStub-va-x11.so.x
- (weitere können in der Zukunft hinzugefügt werden)
Wie Stubs in Qt funktionieren
Wenn FFmpeg dynamisch gelinkt ist:
- Normalerweise erwartet es, dass es gegen Systembibliotheken wie
libssl.so.3
oderlibva.so.2
gelinkt wird. - Qt patcht die FFmpeg-Binärdateien mit Hilfe des
patchelf
-Tools, um diese echten Abhängigkeiten durch Stub-Äquivalente zu ersetzen.
Beispiel:
# Original linkage libffmpegmediaplugin.so: needs libavcodec.so (depends on the FFmpeg libs) libavcodec.so: needs libssl.so.3 # After patching libffmpegmediaplugin.so: needs libavcodec.so (no changes) libavcodec.so: needs libQt6FFmpegStub-ssl.so.3 libQt6FFmpegStub-ssl.so.3: optionally needs libssl.so.3 (no explicit linkage)
Dieses Patching wird automatisch als Teil des Build-/Verteilungsprozesses durchgeführt.
Laufzeitverhalten und Sicherheitshinweise
- FFmpeg-Plugins werden mit
dlopen(..., RTLD_LOCAL)
geladen, so dass Stub-Symbole nicht in die globale Symboltabelle gelangen. - Wenn die Anwendung bereits OpenSSL oder VAAPI verwendet, können die Systembibliotheken aus dem globalen Bereich geholt werden und müssen binärkompatibel sein.
- Die mitgelieferten QtMultimedia und FFmpeg Binärdateien sind kompatibel mit:
- OpenSSL 3.x.x (mit Symbolversionierung
@OPENSSL_3.0.0
) - VAAPI ABI 0.33 (ältere ABI 0.32 wird ausdrücklich nicht unterstützt)
- OpenSSL 3.x.x (mit Symbolversionierung
- Es ist auch möglich, Qt Multimedia gegen OpenSSL 1.x.x zu bauen, obwohl die Kompatibilität von Ihrer FFmpeg-Konfiguration abhängt.
Um die Verwendung von Stub-Bibliotheken vollständig zu entfernen, gibt es zwei Möglichkeiten:
- Verwenden Sie
patchelf
, um die Abhängigkeiten von FFmpeg zu den Systembibliotheken wiederherzustellen (z. B. ersetzen SielibQt6FFmpegStub-ssl.so.3
durchlibssl.so.3
). Dies muss für alle FFmpeg-Bibliotheken durchgeführt werden:libavcodec
,libavformat
,libavutil
,libswresample
, undlibswscale
. - Ersetzen Sie die mitgelieferten FFmpeg-Bibliotheken durch solche, die der Benutzer manuell erstellt hat. Siehe FFmpeg aus den Quellen bauen.
© 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.