# opencv ffmpeg libx264 交叉编译 **Repository Path**: dmcus/opencv-ffmpeg-cross ## Basic Information - **Project Name**: opencv ffmpeg libx264 交叉编译 - **Description**: openc4 arm64 linux 的交叉编译,加入ffmpeg 和 libx264. - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-16 - **Last Updated**: 2025-06-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # opencv ffmpeg libx264 交叉编译 Welcome to the opencv ffmpeg libx264 目标平台 arm64 linux 交叉编译 wiki! 虚拟机系统ubunt20.4 gcc-9.4.0 安装ninja cmake openssl make `sudo apt install cmake cmake-gui ninja-build openssl libssl-dev ccache` ### 1.安装gcc 交叉编译器 这里使用 自己制作的gcc-9.2.0交叉编译器 集成glibc-2.27版本,aarch64-linux-gnu 其他版本没有测试. 请根据自己的系统环境选择合适的编译器,版本太高和太低都可能导致编译出错。 gcc 目录 /opt/cross/armgcc #### cmake 源码安装 若系统自带 cmake 版本小于 3.16,需要源码安装cmake https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3.tar.gz 解压到~/src目录下 ``` mkdir ~/build cd ~/build mkdir cmake cd cmake ~/src/cmake-3.28.3/bootstrap make -j6 sudo make install ``` 常用交叉编译器下载 10.3-- https://developer.arm.com/downloads/-/gnu-a 其他 交叉编译 gcc 下载地址 11.2++ https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 7.5--- http://releases.linaro.org/components/toolchain/binaries/ 11.3++ https://snapshots.linaro.org/gnu-toolchain/ 7.5rc- https://snapshots.linaro.org/components/toolchain/binaries/ ### 2.下载源码 1.https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2 2.git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg 3.https://github.com/opencv/opencv/archive/refs/tags/4.9.0.tar.gz 或者 https://github.com/opencv/opencv/releases 下载4.x 这里使用的是4.9.0 4.https://github.com/opencv/opencv_contrib/archive/refs/tags/4.9.0.tar.gz 其他版本要和opencv 版本一致 https://github.com/opencv/opencv_contrib/tags 5.https://github.com/OpenMathLib/OpenBLAS/archive/refs/tags/v0.3.26.tar.gz 其他版本 https://github.com/OpenMathLib/OpenBLAS/releases 解压源码到 ~/src目录下 ls ~/src ### 3.x264 交叉编译 mkdir ~/build/x264 cd ~/build/x264 ``` ~/src/x264-master/configure \ --prefix=/opt/cross/x264 \ --cross-prefix=/opt/cross/armgcc/bin/aarch64-linux-gnu- \ --disable-cli \ --enable-shared \ --enable-static \ --enable-pic \ --host=aarch64-linux-gnu ``` ``` make make install ``` ### 4.ffmeg 启用x264 交叉编译 ffmpeg 使用 4.x版本 cd ~src/ffmpeg git checkout origin/release/4.4 mkdir ~/build/ffmpeg cd ~/build/ffmpeg `export PKG_CONFIG_PATH=/opt/cross/x264/lib/pkgconfig` ``` ~/src/ffmpeg/configure \ --enable-cross-compile \ --cross-prefix=aarch64-linux-gnu- \ --pkg-config=pkg-config \ --arch=arm64 \ --target-os=linux \ --prefix=/opt/cross/ffmpeg \ --target-path=/opt/cross/ffmpeg \ --enable-shared \ --enable-static \ --enable-gpl \ --extra-libs=-ldl \ --enable-pic \ --enable-libx264 \ --enable-swscale \ --enable-pthreads \ --enable-encoder=libx264 \ --enable-encoder=mjpeg ``` 输出配置信息: External libraries: iconv libx264 External libraries providing hardware acceleration: v4l2_m2m Libraries: avcodec avfilter avutil swresample avdevice avformat postproc swscale ` make -j6` 报错: libavcodec/v4l2_m2m.h:44:18: error: 'PATH_MAX' undeclared here (not in a function) 44 | char devname[PATH_MAX]; 修改源码 v4l2_m2m.h 添加 #incude ` make -j6` `make install` #### 5. OpenBLAS 线性算法库 编译 ``` cd ~/src/OpenBLAS-0.3.26 make CC=/opt/cross/armgcc/bin/aarch64-linux-gnu-gcc \ HOSTCC=gcc TARGET=ARMV8 CROSS=1 \ CROSS_SUFFIX=/opt/cross/armgcc/bin/aarch64-linux-gnu- \ NO_LAPACKE=1 \ BINARY=64 make install PREFIX=/opt/cross/openblas ``` #### 6.opencv 编译 opencv 使用cmake-gui配置方便一些 选中 ``` WITH_FFMPEG BUILD_opencv_world OPENCV_FFMPEG_ENABLE_LIBAVDEVICE WITH_QT BUILD_PNG BUILD_ZLIB CMAKE_INSTALL_PREFIX:/opt/cross/opencv ``` ![cmake-gui配置](https://foruda.gitee.com/images/1710584645967810454/a4a7503b_2328543.png "cmake-gui.PNG") 点击Configure 发现ffmpeg没有找到 FFMPEG: NO avcodec: NO avformat: NO avutil: NO swscale: NO avresample: NO #### 1.需要添加PKG-config路径才能找到 FFMPEG 点击Evnironment 添加 ``` Name :PKG_CONFIG_PATH Value:/opt/cross/ffmpeg/lib/pkgconfig:/opt/cross/x264/lib/pkgconfig:/opt/cross/openblas/lib/pkgconfig ``` 点击Environment 添加环境变量 ``` PKG_CONFIG_LIBDIR /opt/cross/ffmpeg/lib:/opt/cross/x264/lib:/opt/cross/openblas/lib ``` #### 2.点击AddEntry 添加BOOL变量 true ` Name:OPENCV_ENABLE_PKG_CONFIG ` Value: : :fa-check-square-o: 点击Configure 发现ffmpeg没有启动,其他都是YES FFMPEG: NO avcodec: YES (58.134.100) avformat: YES (58.76.100) avutil: YES (56.70.100) swscale: YES (5.9.100) avresample: NO 查看cmake-gui 上面的log发现 _WARNING: Can't build ffmpeg test code_ ffmpeg测试代码ffmpeg_test.cpp编译不通过导致的问题。 #### `~/src/opencv-4.9.0/modules/videoio/cmake/detect_ffmpeg.cmake` ``` if(HAVE_FFMPEG AND NOT HAVE_FFMPEG_WRAPPER AND NOT OPENCV_FFMPEG_SKIP_BUILD_CHECK) try_compile(__VALID_FFMPEG "${OpenCV_BINARY_DIR}" "${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp" CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}" "-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}" OUTPUT_VARIABLE TRY_OUT ) if(NOT __VALID_FFMPEG) # message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}") message(STATUS "WARNING: Can't build ffmpeg test code") set(HAVE_FFMPEG FALSE) endif() endif() ``` ##### 取消注释 message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}") 可以查看错误信息 报错是找不到 ffmpeg的链接库 ~/src/opencv-4.9.0/modules/videoio/cmake/detect_ffmpeg.cmake 修改90行 CMAKE_FLAGS 这段代码即可 添加编译的 include 和lib 目录 ``` CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=/opt/cross/ffmpeg/include;/opt/cross/x264/include" "-DLINK_DIRECTORIES:STRING=/opt/cross/ffmpeg/lib;/opt/cross/x264/lib" "-DLINK_LIBRARIES:STRING=swscale;avformat;avcodec;avutil;swresample;x264" ``` ``` FFMPEG: YES avcodec: YES (58.134.100) avformat: YES (58.76.100) avutil: YES (56.70.100) swscale: YES (5.9.100) avresample: NO avdevice: YES (58.13.100) ``` 错误 :math lib 'libm' not found; floating point support disable Whereis libm命令找到libm所在位置,然后编辑opencv4.9.0/3rdparty/libpng/CMakeLists.txt文件,15行位置添加 libm的目录将路径添加至如下位置。 ``` if(NOT WIN32) find_library(M_LIBRARY NAMES m PATHS /usr/lib /usr/local/lib /opt/cross/armgcc/aarch64-linux-gnu/lib ) if(NOT M_LIBRARY) message(STATUS "math lib 'libm' not found; floating point support disabled") endif() else() # not needed on windows set(M_LIBRARY "") endif() ``` 修改后 M_LIBRARY: /opt/cross/armgcc/aarch64-linux-gnu/lib/libm.so ##### 错误:Can’t Found OpenBLAS libraries: 编辑opencv4.9.0/cmake/OpenCVFindOpenBLAS.cmake下的46行 添加openblas的include 和 lib 目录 ``` SET(Open_BLAS_INCLUDE_SEARCH_PATHS ... /opt/cross/openblas/include ) SET(Open_BLAS_LIB_SEARCH_PATHS ... /opt/cross/openblas/lib ) ``` 查看log Found OpenBLAS libraries: /opt/cross/openblas/lib/libopenblas.so Found OpenBLAS include: /opt/cross/openblas/include LAPACK(OpenBLAS): LAPACK_LIBRARIES: /opt/cross/openblas/lib/libopenblas.so LAPACK(OpenBLAS): Support is enabled. ##### 添加opencv-contrib cmake-gui修改参数 `OPENCV_EXTRA_MODULES_PATH:/home/pi/src/opencv_contrib-4.9.0/modules` 点击configure,其中有个文件60多M,下载可能会失败,用迅雷下载后放在opencv4.9.0/.cache/data 目录下,重命名目录下生成的名字替换即可 https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat 开始编译 ninja ninja install ##### 错误 没有定义 PATH ``` obsensor_stream_channel_v4l2.cpp:106:22: error: 'PATH_MAX' was not declared in this scope 106 | char buf[PATH_MAX]; ``` 修改源码 obsensor_stream_channel_v4l2.cpp 添加 或者 直接定义 #define PATH_MAX 4096 #include ##### 错误 ld 链接错误 ,找不到库文件 `libopenblas.so.0, needed by lib/libopencv_world.so.4.9.0, not found` 需要知道 ld的库和lib目录 打开Advanced 修改CMAKE_EXE_LINKER_FLAGS 参数,添加链接.so文件 ``` CMAKE_EXE_LINKER_FLAGS -L/opt/cross/ffmpeg/lib -L/opt/cross/openblas/lib -L/opt/cross/x264/lib -lopenblas -lswscale -lswresample -lavformat -lavcodec -lavdevice -lavfilter -lavutil -lpostproc -lx264 ```