树莓派4编译带x264的OpenCV时链接自编译FFmpeg报错如何解决
问题根本原因
你遇到的链接错误由FFmpeg与OpenCV版本不兼容导致:
你使用的FFmpeg为5.x开发版本(对应libavcodec.so.59),已经移除了OpenCV 4.5.3依赖的3个旧版API:av_register_all、av_lockmgr_register、avcodec_get_context_defaults3,因此链接时无法找到对应符号。
问题排查方法
1. 查看OpenCV链接时的依赖库路径
- 进入OpenCV编译目录,查看CMake缓存的FFmpeg配置:
grep -i ffmpeg CMakeCache.txt
输出会明确显示cmake检测到的libavcodec、libavformat等FFmpeg库的实际路径。
- 查看完整的编译链接参数:
编译时添加VERBOSE=1参数即可打印所有ld链接命令,确认FFmpeg相关库的路径是否正确:
make -j4 VERBOSE=1
2. 检查FFmpeg共享库是否正常
- 首先验证FFmpeg基础功能:执行
ffmpeg -version,如果能正常输出版本信息,说明共享库基础加载无问题。 - 检查库内是否包含目标符号:
# 以检查av_register_all符号为例 nm -D /usr/lib/libavcodec.so | grep av_register_all
如果输出为空,说明当前FFmpeg库确实不存在该符号,可确认是版本不兼容问题。
解决方法
推荐选择方案1,操作门槛更低:
方案1:降级FFmpeg到4.x稳定版
- 卸载当前安装的FFmpeg:
sudo dpkg -r ffmpeg
- 下载FFmpeg 4.4版本源码(4.x系列最后一个稳定版,支持你需要的x264、树莓派OMX硬件加速等所有特性),按照你之前的配置、编译、安装流程重新部署FFmpeg。
- 清空OpenCV编译目录的所有缓存文件,删除
CMakeCache.txt后重新执行cmake配置,注意修正cmake命令中的参数错误:原配置里OPENCV_EXTRA_MODULES_PATH参数的等号后多了空格,会导致路径识别错误,改为:
-D OPENCV_EXTRA_MODULES_PATH=$PWD/../opencv_contrib/modules
- 重新编译OpenCV即可解决链接错误。
方案2:给OpenCV 4.5.3打FFmpeg 5.x适配补丁
如果需要保留新版FFmpeg,可以从OpenCV官方5.x版本的提交记录中提取FFmpeg API兼容补丁,修改modules/videoio/src/cap_ffmpeg.cpp中的API调用逻辑,适配新版FFmpeg的接口,该方案对Linux操作熟练度要求较高,不推荐新手使用。
内容的提问来源于stack exchange,提问作者Drew
相关产品推荐
相关产品推荐

