opencv3.4.15 arm-linux 交叉编译带FFMPEG


背景说明:

  按照网上说的,或者直接工具链编译,FFMPEG都不会编译,永远显示 NO。网上说的,下载交叉编译libxvid,libx264可能适用3.1以前版本,新版本3.4.15反正不行。

编译方法:

1、依赖库

  libz,libxvid,libx264这三个库提前交叉编译好放到一个文件夹下,在lib下找到pkgconfig,把pkgconfig里的*.pc文件拷贝到默认的pkgconfig读取路径(usr/lib/pkgconfig/  或者 usr/lib64/pkgconfig/ 或者 usr/local/lib/pkgconfig/);

2、修改 opencv3.4.15/cmake/OpenCVFindLibsVideo.cmake

  在测试 ffmpeg_test.cpp的那几行里修改(大概在250几行)

  "-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}"

  改为:

  "-DLINK_LIBRARIES:STRING=avformat;avcodec;z;x264;xvidcore;swresample;swscale;avutil;m;atomic"

  保存

3、cmake命令

     cmake -DCMAKE_TOOLCHAIN_FILE=../armLinuxSetup.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$OPENCV_INSTALL -DOPENCV_ENABLE_PKG_CONFIG=ON ..

至此,就可以编译成功了,以下编译过程只为记录遇到问题解决问题的过程。

编译过程:

  1、交叉编译完libz,libx264,libxvid之后交叉编译ffmpeg,出现一个关于libxvid找不到的错误,分析原因,发现时按照网上的提示编译的libxvid没有指定平台,结果编译出64位的库,编译libxvid时添加target=arm即可解决,然后再重新编译ffmpeg就可以编译通过了;

  2、再编译opencv,按网上提示的指令配置之后,FFMPEG那一栏全部显示NO;

  3、上网找原因解决方法,说是pkg-config找不到,于是把前面编译的库所在目录的lib/pkgconfig里的所有pc文件拷贝到默认目录 如:usr/lib/pkgconfig/ 之类;

  4、还是没有卵用,不过提到了pkg-config,就在opencv的CMakeList.txt里找pkg-config相关词,果然发现一个OPENCV_ENABLE_PKG_CONFIG,字面意思都可以理解了就是打开pkg-config这个功能,于是在cmake时加上 -DOPENCV_ENABLE_PKG_CONFIG=ON;

  5、然后有变化了,除了FFMPEG是NO,FFMPEG下面的库变成YES了,终于前进一步了;

    6、于是接着查找发现是ffmpeg_test.cpp编译测试没通过,然后我单独测试编译ffmpeg_test.cpp把前面编依赖库都加上发现可以编译通过,这就奇怪了;

  7、再后面查找CMakeCache.txt里的FFMPEG_LIBRARIES发现加载的只有(avformat;avcodec;swresample;swscale;avutil)等几个库,但是我又找不到哪里直接改FFMPEG_LIBRARIES,干脆直接把

  "-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}"

  改为:

  "-DLINK_LIBRARIES:STRING=avformat;avcodec;z;x264;xvidcore;swresample;swscale;avutil;m;atomic"。

  8、接着再opencv,configure就都是yes了。