Ubuntu16.04下编译带FFmpeg的OpenCV遇问题求助
我来帮你一步步捋清楚这两个问题,都是老版本Ubuntu+OpenCV/FFmpeg组合里常见的坑:
一、OpenCV3.1编译时缺失libavresample.a的问题
你说FFmpeg里libavresample已经被弃用,这刚好戳中了问题的核心——OpenCV3.1的默认构建配置还在依赖这个已被移除的库,但你编译的FFmpeg已经把它去掉了。
有两个可行的解决方向:
方向1:给FFmpeg补回
libavresample
虽然这个库已经被弃用,但为了兼容OpenCV3.1,只能临时启用它。重新编译FFmpeg时,在configure命令里加上--enable-avresample参数:./configure --prefix=/home/nyan/ffmpeg_build --enable-avresample [你的其他FFmpeg编译参数] make -j$(nproc) && sudo make install编译完成后,再重新配置OpenCV3.1的CMake,应该就能找到这个库了。
方向2:让CMake精准指向你编译的FFmpeg
有时候CMake会优先找系统自带的FFmpeg(可能版本不匹配),所以要明确指定路径:# 先清理之前的CMake缓存 rm -rf CMakeCache.txt CMakeFiles/ # 重新配置 cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_FFMPEG=ON \ -D FFMPEG_INCLUDE_DIR=/home/nyan/ffmpeg_build/include \ -D FFMPEG_LIB_DIR=/home/nyan/ffmpeg_build/lib \ ..这样CMake就会直接用你自己编译的FFmpeg,不会去碰系统里的旧版本。
二、OpenCV3.4.1编译成功但未集成FFmpeg、无法读取摄像头的问题
首先得先确认OpenCV到底有没有真的集成FFmpeg,你可以跑这个命令检查:
opencv_version --verbose
看输出里有没有FFmpeg: YES的标记,如果没有,说明CMake配置阶段就没正确找到FFmpeg,后续的问题都是由此引发的。
具体解决步骤:
重新配置CMake,强制关联FFmpeg并开启视频设备支持
先清空之前的缓存,然后重新配置,重点加上WITH_V4L=ON(这个是让OpenCV支持V4L2设备,也就是你的摄像头),同时明确指定FFmpeg路径:rm -rf CMakeCache.txt CMakeFiles/ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_FFMPEG=ON \ -D FFMPEG_INCLUDE_DIR=/home/nyan/ffmpeg_build/include \ -D FFMPEG_LIB_DIR=/home/nyan/ffmpeg_build/lib \ -D WITH_V4L=ON \ -D WITH_GSTREAMER=OFF \ # 避免和FFmpeg冲突,不需要的话就关掉 ..配置完成后,看CMake的输出日志,确认
FFmpeg: YES已经出现,再继续编译。检查FFmpeg的编译参数是否足够
你编译FFmpeg时,要确保启用了OpenCV需要的核心模块和设备支持,比如:./configure --prefix=/home/nyan/ffmpeg_build \ --enable-gpl \ --enable-nonfree \ --enable-swscale \ --enable-avcodec \ --enable-avformat \ --enable-v4l2_m2m \ # 支持V4L2硬件加速,可选但推荐 --disable-avresample \ # 3.4.1不需要这个废弃库了 [你的其他参数] make -j$(nproc) && sudo make install这些参数能保证FFmpeg具备被OpenCV调用的必要功能。
编译完成后的验证步骤
重新编译安装OpenCV:make -j$(nproc) && sudo make install sudo ldconfig # 更新系统库缓存然后再次用
opencv_version --verbose确认FFmpeg已集成。接下来测试摄像头:- 先检查系统里的视频设备是否存在:
ls /dev/video*,如果能看到/dev/video0之类的设备,说明硬件没问题。 - 可以用OpenCV自带的测试程序验证:
./opencv/build/bin/opencv_test_videoio,看是否能成功读取摄像头画面。
- 先检查系统里的视频设备是否存在:
最后,Ubuntu16.04的系统依赖比较旧,如果你遇到一些奇怪的编译错误,可以先补全这些基础依赖:
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install libv4l-dev libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev
内容的提问来源于stack exchange,提问作者batuman

