Bibliothèques stub FFmpeg sur Linux et Android
Vue d'ensemble
Pour prendre en charge l'enchaînement dynamique de FFmpeg en conformité avec la licence LGPL, Qt Multimedia utilise des bibliothèques d'extension pour gérer les dépendances externes optionnelles sur les plateformes Linux et Android.
Sur ces plateformes, FFmpeg peut nécessiter des bibliothèques partagées supplémentaires qui ne sont pas fournies avec Qt :
- OpenSSL - nécessaire pour le streaming réseau sécurisé.
- VAAPI (Linux uniquement) - permet le décodage et l'encodage vidéo accélérés par le matériel.
Ces bibliothèques ne sont souvent pas disponibles ou ne peuvent pas être regroupées en raison de contraintes de licence. Pour s'assurer que les fonctionnalités basées sur FFmpeg restent fonctionnelles (à l'exception des parties non prises en charge), Qt fournit des bibliothèques de remplacement (stub).
Pourquoi les stubs sont nécessaires
Si ces dépendances ne sont pas présentes au moment de l'exécution, FFmpeg ne pourra pas se charger ou fonctionner correctement. Le mécanisme des stubs permet
- Le chargement réussi de FFmpeg même si OpenSSL ou VAAPI sont absents.
- Une dégradation progressive des fonctionnalités (par exemple, l'absence de VAAPI entraîne l'absence d'accélération matérielle, mais la lecture fonctionne toujours).
- Les utilisateurs peuvent choisir d' utiliser les versions de ces bibliothèques fournies par leur propre système, si elles sont disponibles.
Ce que sont les stubs
Les bibliothèques stubs imitent les interfaces des bibliothèques réelles (par exemple, libssl.so, libva.so) mais n'implémentent pas toutes les fonctionnalités. Au lieu de cela, elles :
- Fournissent des implémentations factices qui renvoient des valeurs de repli sûres ou des non-opérations.
- Tentent dynamiquement de résoudre les symboles réels via
QLibrary::load/QLibrary::resolve. - échouent de manière élégante si les bibliothèques réelles ne sont pas trouvées.
Qt fournit ces stubs sous les noms :
libQt6FFmpegStub-ssl.so.xlibQt6FFmpegStub-crypto.so.xlibQt6FFmpegStub-va.so.xlibQt6FFmpegStub-va-drm.so.xlibQt6FFmpegStub-va-x11.so.x- (d'autres pourraient être ajoutés à l'avenir)
Comment les stubs fonctionnent dans Qt
Lorsque FFmpeg est lié dynamiquement :
- Il s'attend normalement à être lié à des bibliothèques système comme
libssl.so.3oulibva.so.2. - Qt patche les binaires de FFmpeg en utilisant l'outil
patchelfpour remplacer ces dépendances réelles par des équivalents de type stub.
Exemple :
# 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)
Ce correctif est effectué automatiquement dans le cadre du processus de construction/distribution.
Comportement à l'exécution et notes de sécurité
- Les plugins FFmpeg sont chargés avec
dlopen(..., RTLD_LOCAL), de sorte que les symboles stub ne fuient pas dans la table de symboles globale. - Si l'application utilise déjà OpenSSL ou VAAPI, les bibliothèques système peuvent être récupérées dans le champ d'application global et doivent être compatibles avec les binaires.
- Les binaires livrés avec QtMultimedia et FFmpeg sont compatibles avec :
- OpenSSL 3.x.x (avec version des symboles
@OPENSSL_3.0.0) - VAAPI ABI 0.33 (l'ancienne ABI 0.32 n'est explicitement pas supportée)
- OpenSSL 3.x.x (avec version des symboles
Pour supprimer complètement l'utilisation des bibliothèques stub, il y a deux options :
- Utiliser
patchelfpour restaurer les dépendances de FFmpeg dans les bibliothèques système (par exemple, remplacerlibQt6FFmpegStub-ssl.so.3parlibssl.so.3). Ceci doit être fait pour toutes les bibliothèques de FFmpeg :libavcodec,libavformat,libavutil,libswresample, etlibswscale. - Remplacez les bibliothèques FFmpeg livrées par des bibliothèques construites manuellement par l'utilisateur. Voir Construire FFmpeg à partir des sources.
© 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.