树莓派4B安装OPENCV遇到ffmpeg库版本太高的问题【后续更新】

较新的安装教程:树莓派4B安装OpenCV教程_luoi_han的博客-CSDN博客_树莓派4b安装opencv

这几天安装opencv,其他的问题好说,但是遇到了这个问题:

/home/pi/Downloads/opencv/opencv-master/modules/videoio/src/cap_ffmpeg_impl.hpp:2347:42: error: invalid conversion from ‘const AVCodec*’ to ‘AVCodec*’ [-fpermissive]
     AVCodec* codec = avcodec_find_encoder(c->codec_id);
 

因为在此前,我使用ffmpeg开发了音频采集软件,安装了最新的ffmpeg库。ffmpeg库在3.3版本及以后,有了很大改动,废弃了很多函数,导致程序无法兼容,比如,废弃了 av_register_all(), av_stream 类也没有了codec成员等。

最初,我还以为可以使用安装依赖库的方法降低库版本,比如:

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev 

但是尝试了很多次都失败了。无奈,只能狠心放大招了,重装ffmpeg

1、卸载ffmpeg:

sudo apt-get purge ffmpeg

2、安装ffmpeg

2.1 下载源码

Index of /releases

选择3.3版本以下的源码,下载,然后解压。直接双击下载好的.tar.gz,然后指定一个目录即可,我是放在了Downloads下的ffmpeg文件夹下。

2.2 配置和安装

cd 到解压后的目录下,先配置编译选项

./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree

然后编译
   sudo make -j4

然后安装
   sudo make install

这个时候你会发现,/usr/local/lib文件夹下高版本的库  xxxx.a的创建时间什么的都已经是最新的,说明已经安装成功!

如果没有添加环境变量路径,可以:

sudo nano /etc/ld.so.conf 

然后增加一行:

/usr/local/lib

ctrl+x  -> y ->enter 保存退出,然后刷新环境变量:

sudo ldconfig
这样动态库就生效了

接下来需要重新配置和编译:

删除build下的所有东西:

sudo rm -r *

然后配置make:

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=OFF \ -D OPENCV_EXTRA_MODULES_PATH=/home/pi/Downloads/opencv/opencv_contrib-master/modules \ -D ENABLE_PRECOMPILED_HEADERS=OFF \ -D BUILD_EXAMPLES=ON ..

然后编译还是会出问题,提示找不到对应的库,但是明明已经安装了libav*  的那些库:

[ 76%] Building CXX object modules/videoio/CMakeFiles/opencv_test_videoio.dir/test/test_video_io.cpp.o
[ 76%] Linking CXX executable ../../bin/opencv_test_videoio
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_bitstream_filter_init'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_bitstream_filter_close'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `avcodec_decode_video2'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `avcodec_get_context_defaults3'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_bitstream_filter_filter'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_register_all'
/usr/bin/ld: ../../lib/libopencv_videoio.so.4.4.0: undefined reference to `av_lockmgr_register'
 

2022.04.20 最终解决方案:

SD卡格掉,在不安装ffmpeg的情况下,参考例程安装opencv。快速开卡安装请参考:

空卡安装设置树莓派4B_maum61的专栏-CSDN博客

2022.07.22 新的解决方案

由于库版本问题,更新了opencv到4.5.3版本,这个版本依赖的ffmpeg是 4.1版本的,下载了4.1版本的,具体链接参考下面这个网址:

FFMPEG 最全版本介绍及下载_seniorwizard的博客-CSDN博客_ffmpeg 所有版本

为了不让QT报错,之前把最新版本的FFMPEG下载了,也就是xxx.so.59等,否则QT会报ffmpeg多个版本库可能冲突的提示。现在还是想用命令行的ffmpeg,那就安装4.1的ffmpeg,命令行现在没问题了,QT中引用ffmpeg库和opencv的话,建议还是都使用opencv安装的ffmpeg库,避免冲突。

你可能感兴趣的:(ffmpeg,树莓派,opencv,人工智能,计算机视觉)