Linux 和 Android 上的 FFmpeg 存根库
概述
为支持FFmpeg的动态链接,以符合 LGPL 许可证,Qt Multimedia 使用存根库来处理 Linux 和 Android 平台上的可选外部依赖性。
在这些平台上,FFmpeg 可能需要额外的共享库,而这些库并不随 Qt 一起提供:
- OpenSSL- 安全网络流所需。
- VAAPI(仅限 Linux)- 支持硬件加速视频解码和编码。
由于许可限制,这些库通常不可用或无法捆绑。为确保基于 FFmpeg 的功能保持正常(不包括不支持的部分),Qt 提供了存根库作为后备。
为什么需要存根
如果运行时不存在这些依赖项,FFmpeg 将无法加载或正常运行。存根机制允许
- 即使 OpenSSL 或 VAAPI 丢失,也能成功加载 FFmpeg。
- 功能的优雅降级(例如,缺少 VAAPI 会导致无硬件加速,但播放仍可正常工作)。
- 用户可选择使用自己系统提供的这些库版本(如果有的话)。
什么是存根
存根库模仿真实库的接口(如libssl.so
,libva.so
),但不实现全部功能。相反,它们
- 提供虚拟实现,返回安全的回退值或 no-ops。
- 通过
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(符号版本
- 也可以根据OpenSSL 1.x.x 构建Qt Multimedia ,但兼容性取决于您的 FFmpeg 配置。
要完全取消使用存根库,有两种选择:
- 使用
patchelf
将 FFmpeg 的依赖库还原为系统库(例如,用libssl.so.3
替换libQt6FFmpegStub-ssl.so.3
)。所有 FFmpeg 库都必须这样做:libavcodec
,libavformat
,libavutil
,libswresample
, 和libswscale
。 - 用用户手动构建的 FFmpeg 库替换已发布的 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.