Sur cette page

Bibliothèques stub FFmpeg sous Linux et Android

Présentation

Afin de prendre en charge la liaison dynamique de FFmpeg conformément à la licence LGPL, Qt Multimedia utilise des bibliothèques de remplacement pour gérer les dépendances externes facultatives 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 – requis pour la diffusion en continu sécurisée sur le réseau.
  • 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 intégrées en raison de contraintes de licence. Afin de garantir le bon fonctionnement des fonctionnalités basées sur FFmpeg (à l’exception des parties non prises en charge), Qt fournit des bibliothèques « stubs » comme solutions de repli.

Pourquoi les stubs sont-ils 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 en l'absence d'OpenSSL ou de VAAPI.
  • Une dégradation en douceur des fonctionnalités (par exemple, l’absence de VAAPI entraîne l’absence d’accélération matérielle, mais la lecture fonctionne toujours).
  • Aux utilisateurs de choisir d’utiliser leurs propres versions de ces bibliothèques fournies par le système, si elles sont disponibles.

Qu'est-ce qu'un stub ?

Les bibliothèques « stubs » imitent les interfaces des bibliothèques réelles (par exemple, libssl.so, libva.so) mais n’implémentent pas l’ensemble des fonctionnalités. À la place, elles :

  • Fournissent des implémentations factices qui renvoient des valeurs de secours sûres ou des opérations nulles.
  • Tentent dynamiquement de résoudre les symboles réels via QLibrary::load / QLibrary::resolve.
  • Gèrent gracieusement les échecs si les bibliothèques réelles ne sont pas trouvées.

Qt fournit ces stubs sous les noms suivants :

  • libQt6FFmpegStub-ssl.so.x
  • libQt6FFmpegStub-crypto.so.x
  • libQt6FFmpegStub-va.so.x
  • libQt6FFmpegStub-va-drm.so.x
  • libQt6FFmpegStub-va-x11.so.x
  • (d'autres pourraient être ajoutés à l'avenir)

Fonctionnement des stubs dans Qt

Lorsque FFmpeg est lié dynamiquement :

  • Il s'attend normalement à être lié à des bibliothèques système telles que libssl.so.3 ou libva.so.2.
  • Qt modifie les binaires FFmpeg à l'aide de l'outil patchelf afin de remplacer ces dépendances réelles par des stubs équivalents.

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)

Cette modification est effectuée automatiquement dans le cadre du processus de compilation/distribution.

Comportement à l'exécution et remarques de sécurité

  • Les plugins FFmpeg sont chargés avec ` dlopen(..., RTLD_LOCAL)`, de sorte que les symboles factices ne se retrouvent 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 l'espace de noms global et doivent être compatibles au niveau binaire.
  • Les binaires QtMultimedia et FFmpeg fournis sont compatibles avec :
    • OpenSSL 3.x.x (avec gestion des versions des symboles @OPENSSL_3.0.0)
    • VAAPI ABI 0.33 (l’ancienne version ABI 0.32 n’est explicitement pas prise en charge)

Pour supprimer complètement l’utilisation des bibliothèques de remplacement, deux options s’offrent à vous :

  • Utiliser patchelf pour rétablir les dépendances de FFmpeg par rapport aux bibliothèques système (par exemple, remplacer libQt6FFmpegStub-ssl.so.3 par libssl.so.3). Cette opération doit être effectuée pour toutes les bibliothèques FFmpeg : libavcodec, libavformat, libavutil, libswresample et libswscale.
  • Remplacer les bibliothèques FFmpeg fournies par celles compilées manuellement par l'utilisateur. Voir Compiler FFmpeg à partir du code source.

© 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.