LinuxおよびAndroidにおけるFFmpegスタブライブラリ
概要
LGPL ライセンスに準拠してFFmpegの動的リンクをサポートするため、Qt Multimedia では、Linux および Android プラットフォーム上でオプションの外部依存関係を処理するためにスタブライブラリを使用しています。
これらのプラットフォームでは、FFmpeg に Qt に同梱されていない追加の共有ライブラリが必要になる場合があります:
- OpenSSL- セキュアなネットワークストリーミングに必要です。
- VAAPI(Linuxのみ) - ハードウェアアクセラレーションによる動画のデコードおよびエンコードを可能にします。
これらのライブラリは、利用できない場合や、ライセンス上の制約によりバンドルできない場合がしばしばあります。FFmpeg ベースの機能(サポート対象外の部分を除く)が確実に動作し続けるよう、Qt では代替手段としてスタブライブラリを提供しています。
スタブが必要な理由
実行時にこれらの依存関係が存在しない場合、FFmpegは読み込みに失敗するか、正常に機能しなくなります。スタブ機構により、以下のことが可能になります:
- OpenSSL や VAAPI が欠如している場合でも、FFmpeg を正常に読み込むことができます。
- 機能の段階的な低下(例:VAAPI がない場合はハードウェアアクセラレーションは利用できませんが、再生自体は可能です)。
- 利用可能な場合、ユーザーがシステムに標準で搭載されているこれらのライブラリの使用を選択できる。
スタブとは
スタブライブラリは、実際のライブラリ(例:libssl.so 、libva.so )のインターフェースを模倣しますが、完全な機能を実装しているわけではありません。その代わりに、スタブライブラリは以下のことを行います:
- 安全なフォールバック値を返す、あるいは何もしないダミー実装を提供します。
QLibrary::loadやQLibrary::resolveを通じて、実際のシンボルを動的に解決しようと試みます。- 実際のライブラリが見つからない場合は、正常に処理を終了します。
Qtでは、これらのスタブを以下の名前で提供しています:
libQt6FFmpegStub-ssl.so.xlibQt6FFmpegStub-crypto.so.xlibQt6FFmpegStub-va.so.xlibQt6FFmpegStub-va-drm.so.xlibQt6FFmpegStub-va-x11.so.x- (将来的に追加される可能性があります)
Qt におけるスタブの動作
FFmpegが動的にリンクされる場合:
- 通常、
libssl.so.3やlibva.so.2といったシステムライブラリに対してリンクされることを想定しています。 - Qtは、
patchelfツールを使用してFFmpegバイナリにパッチを適用し、これらの実際の依存関係をスタブによる代替物に置き換えます。
例:
# 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)このパッチ適用は、ビルド/配布プロセスの一環として自動的に行われます。
実行時の挙動とセキュリティに関する注意事項
- FFmpegプラグインは
dlopen(..., RTLD_LOCAL)で読み込まれるため、スタブシンボルがグローバルシンボルテーブルに漏れることはありません。 - アプリケーションがすでに OpenSSL または VAAPI を使用している場合、システムライブラリはグローバルスコープから取得される可能性があり、バイナリ互換性が確保されている必要があります。
- 同梱のQtMultimedia およびFFmpegバイナリは、以下と互換性があります:
- OpenSSL 3.x.x(シンボルバージョン管理方式
@OPENSSL_3.0.0) - VAAPI ABI 0.33(旧バージョンの ABI 0.32 は明示的にサポート対象外)
- OpenSSL 3.x.x(シンボルバージョン管理方式
スタブライブラリの使用を完全に排除するには、次の2つの方法があります:
patchelfを使用して、FFmpeg の依存関係をシステムライブラリに戻します(例:libQt6FFmpegStub-ssl.so.3をlibssl.so.3に置き換えます)。この処理は、すべての FFmpeg ライブラリ(libavcodec、libavformat、libavutil、libswresample、およびlibswscale)に対して行う必要があります。- 同梱されている FFmpeg ライブラリを、ユーザーが手動でビルドしたライブラリに置き換えてください。「ソースから FFmpeg をビルドする」を参照してください。
© 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.