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.x
libQt6FFmpegStub-crypto.so.x
libQt6FFmpegStub-va.so.x
libQt6FFmpegStub-va-drm.so.x
libQt6FFmpegStub-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(シンボルのバージョニング付き
- 互換性はFFmpegの設定に依存しますが、OpenSSL 1.x.xに対して Qt Multimedia 。
スタブライブラリの使用を完全に取り除くには、2つの方法があります:
patchelf
を使って、FFmpeg の依存関係をシステムライブラリに戻す(たとえば、libQt6FFmpegStub-ssl.so.3
をlibssl.so.3
に置き換える)。これはすべてのFFmpegライブラリに対して行う必要があります:libavcodec
libavformat
,libavutil
,libswresample
, およびlibswscale
。- 出荷時の FFmpeg ライブラリを、ユーザーが手動でビルドしたものに置き換えます。ソースからFFmpegをビルドするを参照してください。
© 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.