不少人在CentOS环境下配置OpenCV时,常常遇到一个令人头疼的问题:按照教程一步步操作,编译安装也没有报错,但一旦尝试读取视频文件,就会提示失败。经过排查,才发现是缺少ffmpeg支持。更让人崩溃的是,明明通过yum或者编译方式成功安装了ffmpeg,重新configure OpenCV后依然检测不到。问题的根源在于——OpenCV在configure阶段根本没有识别到已经安装好的ffmpeg,两者之间缺少了关键关联。下面我将还原正确的配置流程,重点在于路径设置和文件拷贝,一步都不能遗漏。
1、获取ffmpeg源码:
首先通过SVN下载ffmpeg源码(目前也可用git,但原始教程采用svn方式):
svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
2、配置ffmpeg编译参数:
进入ffmpeg目录后,执行配置命令,有两个关键参数必须注意:--enable-shared 和 --prefix=/usr。前者用于生成动态库,相信大家都能理解;后者指定安装路径为/usr,这是最容易忽略的细节。为什么一定要改成/usr?因为OpenCV的CMakeLists.txt在检测ffmpeg时,默认会到/usr目录下查找头文件和库文件,而ffmpeg的默认安装路径是/usr/local。如果不将prefix改为/usr,OpenCV的cmake步骤就会认为系统中没有安装ffmpeg,从而自动跳过视频支持。因此,这一步务必执行:./configure --enable-shared --prefix=/usr
3、编译与安装:
接着执行以下命令:
makesu -c "make install"
4、关键步骤——让OpenCV正确找到ffmpeg的头文件:
ffmpeg安装完成后,头文件默认位于/usr/include下,但OpenCV的cmake检测脚本会专门去/usr/include/ffmpeg目录下查找。因此,需要手动创建该目录,并将相关头文件复制过去:
4.1)以root身份执行:
mkdir /usr/include/ffmpeg
cp /usr/include/liba v* /usr/include/libsw* /usr/include/ffmpeg/
(注意:复制操作需要在/usr/include目录下执行,或者明确指定源路径。)
4.2)返回OpenCV源码目录,执行cmake:
cmake .(cmake与点号之间需保留空格)
如果前面所有步骤都正确,此时cmake的输出信息中应该会出现ffmpeg: 1(之前为0),这表明OpenCV已成功检测到ffmpeg。
4.3)接着执行:
make install
5、可选但强烈推荐——复制pkg-config文件:
将/usr/local/lib/pkgconfig/opencv.pc复制到/usr/lib/pkgconfig目录下。这一步虽然不是强制性的(编译时也可以手动指定头文件和库路径),但复制后可以让pkg-config自动识别OpenCV配置,省去后续的麻烦。打开这个文件查看,里面其实就是一些编译链接参数,非常直观。
6、配置动态库搜索路径:
以root身份编辑/etc/ld.so.conf,在文件末尾添加一行:
/usr/local/lib
为什么要添加这一行?因为OpenCV的库文件默认安装到/usr/local/lib,但系统启动时默认不会加载这个目录下的动态库。如果不添加,运行程序时可能会提示找不到库文件。
7、刷新动态库缓存:
最后执行以下命令:
ldconfig
至此,ffmpeg与OpenCV之间的关联已经全部建立完成。重新编译你的OpenCV项目,视频文件的读取应该就可以正常工作了。
