当前位置:   article > 正文

OpenCV+FFmpeg交叉编译_opencv交叉编译 ffmpeg

opencv交叉编译 ffmpeg

本文使用mips架构交叉编译器,请按照如下步骤进行编译:

交叉编译工具:mips-linux-gnu-g++、mips-linux-gnu-gcc

版本:opencv 4.2.0、 ffmpeg 4.2.2

先配置编译器:

export TOOLCHAIN_DIR=/workspace/platform/magik/InferenceKit/nna1/mips720-glibc229/

export CROSS_COMPILE=${TOOLCHAIN_DIR}/bin/mips-linux-gnu-

export CC=${CROSS_COMPILE}gcc

1. 编译X264

  1. # wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2
  2. # tar xvjf  x264-master.tar.bz2  
  3. # cd x264-master
  4. # ./configure --host=mips-linux --prefix=./build/x264-mips --enable-shared --enable-debug --disable-asm
  5. # make
  6. # make install

注意安装到:/usr/local/x264-arm目录了

2.  编译YASM

  1. # wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
  2. # tar xvzf yasm-1.3.0.tar.gz
  3. # cd yasm-1.3.0
  4. # ./configure --prefix=/usr/local/ --host=arm-linux
  5. # make
  6. # make install

注意安装到:/usr/local/目录了

3. 编译SDL2

  1. # wget http://www.libsdl.org/release/SDL2-2.0.12.tar.gz
  2. # tar xvzf SDL2-2.0.12.tar.gz
  3. # cd SDL2-2.0.12
  4. # ./configure --prefix=/usr/local/ --host=arm-linux --target=arm-linux
  5. # make
  6. # make install

注意安装到:/usr/local/目录了

4. 编译FFmpeg(重点)

  1. # wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2
  2. # tar xvjf ffmpeg-4.2.2.tar.bz2
  3. # cd ffmpeg-4.2.2
  4. # ./configure --cross-prefix=$CROSS_COMPILE --enable-cross-compile --target-os=linux --cc="$CC" --arch=mips --prefix=./build/install --enable-shared --disable-static --enable-ffmpeg --enable-libx264 --enable-gpl --extra-ldflags=-L/data3/zhoubin/AIFreezer/shotEngine_tracker_iceFreezer_v2/third_party/x264-master/build/x264-mips/lib --extra-cflags=-I/data3/zhoubin/AIFreezer/shotEngine_tracker_iceFreezer_v2/third_party/x264-master/build/x264-mips/include
  5. # make
  6. # make install

注意安装到:/usr/local/arm_ffmpeg目录了,可以选择其他目录。

请加上:--enable-libx264 

如果编译找不到libx264请加上以下(将x264的pkgconfig导入PKG_CONFIG_PATH和PKG_CONFIG_LIBDIR都无效不知为啥):

--extra-ldflags=-L/path/to/libx264  --extra-cflags=-I/path/to/libx264/include

5. 交叉编译Opencv 4.2.0

Opencv下载路径:Releases - OpenCV,注意下载源码。

解压后进入目录,创建交叉编译工具链: toolchain.cmake,新建一个文件(toolchain.cmake),内容如下:

  1. set( CMAKE_SYSTEM_NAME Linux )
  2. SET ( CMAKE_SYSTEM_PROCESSOR mips )
  3. SET(TOOLCHAIN_DIR /data3/zhoubin/AIFreezer/shotEngine_tracker_iceFreezer_v2/platform/magik/mips-linux-gnu-ingenic-gcc7.2.0-glibc2.29-fp64)
  4. SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/mips-linux-gnu-gcc)
  5. SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/mips-linux-gnu-g++)
  6. #ffmpeg lib dir
  7. set( CMAKE_FIND_ROOT_PATH "/usr/local/arm_ffmpeg/lib" )
  8. set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
  9. set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
  10. set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

其中CMAKE_FIND_ROOT_PATH 为上面编译生成的ffmpeg路径lib

执行cmake:

  1. mkdir build
  2. cd build
  3. cmake -DWITH_FFMPEG=ON -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..

出现以下问题和解决办法:

1)总是找不到FFmpeg:

原因是: 禁用了pkg-config

解决办法:

尝试在运行cmake时候加入-D PKG_CONFIG_PATH失败,在cmake运行时候加入

将ffmpeg的pkgconfig对应路径赋值给PKG_CONFIG_LIBDIR:

export PKG_CONFIG_LIBDIR=/usr/local/arm-ffmpeg/lib/pkgconfig

opencv是通过PKG_CONFIG_LIBDIR路径下的.pc文件查找依赖库的,ffmpeg的pkgconfig包括如下的一些组件:

执行cmake命令后有了avformat等,但是ffmpeg还是NO

原因是ffmpeg test code没有编译成功然后HAVE_FFMPEG被置为了OFF。

看modules/videoid/cmake detect_ffmpeg.cmake中

编译需要FFMPEG_INCLUDE_DIRS和FFMPEG_LIBRARIES路径,导入这些路径到ffmpeg安装路径的include和lib

export FFMPEG_INCLUDE_DIRS=...

export FFMPEG_LIBRARIES=...

发现还是不行!直接不编译ffmpeg 的test注释掉这段:

删除所有文件重新执行:

cmake -D WITH_FFMPEG=ON -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..

成功了:

执行编译:make -j55

发现出现错误:

那个是ffmpeg的库链接不到,试了export LD_LIBRARY_PATH=/usr/local/arm-ffmpeg/lib不行!

在Opencv源码的CMakeLists.txt中加入:

link_directories("/usr/local/arm_ffmpeg/lib/"):

编译:make -j55  出现找不到x264库链接:

同样在Opencv源码的CMakeLists.txt中加入x264库的安装lib:

link_directories("/Workspace/third_party/x264-master/build/x264-mips/lib"):

再执行编译:make -j55  终于成功了!

make install 完成安装!

高兴的太早了!! 板子上运行程序涉及到ffmpeg相关函数时候就出现了illegal instruction,直接运行ffmpeg中bin程序中的可执行文件也出现illegal instruction,运行x264中的bin文件程序不会出错。说明ffmpeg编译的时候指令集没有选正确!

板子上执行 cat /proc/cpuinfo | grep mips 查看支持的指令集:

cpu 指令集为mips32r2,对应到ffmpeg的configure选项当中时,没有对应的cpu架构与之匹配:config时候需要禁用除了mips32r2以外的指令集! 重新编译ffmpeg

  1. # cd ffmpeg-4.2.2
  2. # ./configure --cross-prefix=$CROSS_COMPILE --enable-cross-compile --cc="$CC" --prefix=./build/install --enable-shared --disable-static --enable-ffmpeg --enable-libx264 --enable-gpl --extra-ldflags=-L/data3/zhoubin/AIFreezer/shotEngine_tracker_iceFreezer_v2/third_party/x264-master/build/x264-mips/lib --extra-cflags=-I/data3/zhoubin/AIFreezer/shotEngine_tracker_iceFreezer_v2/third_party/x264-master/build/x264-mips/include --arch=mips --enable-mips32r2 --disable-mipsdsp1 --disable-mipsdspr2 --disable-mips32r1 --disable-mipsfpu --disable-mips64r2 --disable-mips32r6 --target-os=linux
  3. # make
  4. # make install

编译完成,不用重新编译opencv,因为so文件是运行时候才链接。

运行成功!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/803695
推荐阅读
相关标签
  

闽ICP备14008679号