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 oder libva.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)
  • 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 Sie 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 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.