FFmpeg-Stub-Bibliotheken unter Linux und Android
Übersicht
Um die dynamische Verknüpfung von FFmpeg gemäß der LGPL-Lizenz zu unterstützen, verwendet Qt Multimedia Stub-Bibliotheken, um optionale externe Abhängigkeiten auf Linux- und Android-Plattformen zu verwalten.
Auf diesen Plattformen benötigt FFmpeg möglicherweise zusätzliche Shared Libraries, die nicht im Lieferumfang von Qt enthalten sind:
- OpenSSL – erforderlich für sicheres Netzwerk-Streaming.
- VAAPI (nur Linux) – ermöglicht 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 weiterhin funktionieren (mit Ausnahme der nicht unterstützten Teile), stellt Qt Stub-Bibliotheken als Ausweichlösung bereit.
Warum Stubs benötigt werden
Sind diese Abhängigkeiten zur Laufzeit nicht vorhanden, kann FFmpeg nicht geladen werden oder funktioniert nicht ordnungsgemäß. Der Stub-Mechanismus ermöglicht:
- Das erfolgreiche Laden von FFmpeg, selbst wenn OpenSSL oder VAAPI fehlen.
- Eine sanfte Funktionsreduzierung (z. B. führt das Fehlen von VAAPI dazu, dass keine Hardwarebeschleunigung erfolgt, die Wiedergabe funktioniert jedoch weiterhin).
- Benutzern die Möglichkeit, die vom System bereitgestellten Versionen dieser Bibliotheken zu verwenden, sofern diese verfügbar sind.
Was Stubs sind
Stub-Bibliotheken ahmen die Schnittstellen der echten Bibliotheken nach (z. B. libssl.so, libva.so), implementieren jedoch nicht den vollen Funktionsumfang. Stattdessen:
- Stellen Dummy-Implementierungen bereit, die sichere Fallback-Werte oder No-Ops zurückgeben.
- versuchen dynamisch, echte Symbole über
QLibrary::load/QLibrary::resolveaufzulösen. - Schließen sie sich ordnungsgemäß ab, wenn die echten Bibliotheken nicht gefunden werden.
Qt liefert diese Stubs unter folgenden Namen aus:
libQt6FFmpegStub-ssl.so.xlibQt6FFmpegStub-crypto.so.xlibQt6FFmpegStub-va.so.xlibQt6FFmpegStub-va-drm.so.xlibQt6FFmpegStub-va-x11.so.x- (weitere können in Zukunft hinzukommen)
So funktionieren Stubs in Qt
Wenn FFmpeg dynamisch verknüpft wird:
- Erwartet es normalerweise, gegen Systembibliotheken wie
libssl.so.3oderlibva.so.2verknüpft zu werden. - Qt patcht die FFmpeg-Binärdateien mit dem Tool „
patchelf“, um diese tatsächlichen Abhängigkeiten durch entsprechende Stubs 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)Diese Anpassung erfolgt automatisch als Teil des Build- bzw. Distributionsprozesses.
Hinweise zum Laufzeitverhalten und zur Sicherheit
- FFmpeg-Plugins werden mit
dlopen(..., RTLD_LOCAL)geladen, sodass keine Stub-Symbole in die globale Symboltabelle gelangen. - Wenn die Anwendung bereits OpenSSL oder VAAPI verwendet, werden die Systembibliotheken möglicherweise aus dem globalen Bereich bezogen 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 (die ältere ABI 0.32 wird ausdrücklich nicht unterstützt)
- OpenSSL 3.x.x (mit Symbolversionierung „
Um die Verwendung von Stub-Bibliotheken vollständig zu entfernen, gibt es zwei Möglichkeiten:
- Verwenden Sie „
patchelf“, um die Abhängigkeiten von FFmpeg wieder auf die Systembibliotheken zurückzusetzen (ersetzen Sie z. B. „libQt6FFmpegStub-ssl.so.3“ durch „libssl.so.3“). Dies muss für alle FFmpeg-Bibliotheken durchgeführt werden: „libavcodec“, „libavformat“, „libavutil“, „libswresample“ und „libswscale“. - Ersetzen Sie die mitgelieferten FFmpeg-Bibliotheken durch solche, die vom Benutzer manuell kompiliert wurden. Siehe „FFmpeg aus dem Quellcode kompilieren“.
© 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.