设置交叉编译环境
首先,确保您的系统已经配置了RV1126的交叉编译工具链。
X264编译
编译安装x264
使用git下载x264相关文件(也可以下载压缩包)。
编写x264编译安装脚本build_x264.sh。
#!/bin/bash
# 设置工具链路径
TOOLCHAIN_PATH=/path/to/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
GCC_COMPILER=${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf
# 设置x264安装路径
X264_INSTALL_DIR=/path/to/rv1126-YoloV5-Deepsort-master/3rdparty/x264
# 配置交叉编译选项,直接指定 C 和 C++ 编译器
./configure --prefix=${X264_INSTALL_DIR} \
--cross-prefix=${GCC_COMPILER}- \
--cc=${GCC_COMPILER}-gcc \
--cxx=${GCC_COMPILER}-g++ \
--host=arm-linux \
--enable-cross-compile \
--enable-shared \
--disable-static \
--enable-pic \
--extra-cflags="-g -I${TOOLCHAIN_PATH}/include" \
--extra-ldflags="-L${TOOLCHAIN_PATH}/lib"
# 编译并安装x264
make -j$(nproc)
make install
验证x264架构
由于最后的开发板是RV1126,arm架构,最好需要在编译安装完成之后,验证x264的架构。
cd /path/to/x264/lib(x264保存目录)
#验证得到的x264架构
file libx264.so.164
得到arm架构的信息 。
ffmpeg编译
下载ffmpeg
由于后续编译安装的是opencv-4.5.3,为了使ffmpeg 和opencv版本匹配,选择ffmpeg-4.1.3进行交叉编译安装。
# 下载FFmpeg源码
FFMPEG_VERSION=4.1.3
wget https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2
tar -xjf ffmpeg-${FFMPEG_VERSION}.tar.bz2
cd ffmpeg-${FFMPEG_VERSION}
编译安装ffmpeg
下载好了ffmpeg 之后可以运行下面的脚本,编译ffmpeg并且链接到之前编译好的X264.
#!/bin/bash
# 设置工具链路径
TOOLCHAIN_PATH=/path/to/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
GCC_COMPILER=${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf
X264_INSTALL_DIR=/work/zgmcode/rv1126-YoloV5-Deepsort-master/3rdparty/x264
# 设置FFmpeg安装路径
FFMPEG_INSTALL_DIR=/path/to/ffmpeg
# 配置交叉编译选项,直接指定 C 和 C++ 编译器
./configure --prefix=${FFMPEG_INSTALL_DIR} \
--cc=${GCC_COMPILER}-gcc \
--cxx=${GCC_COMPILER}-g++ \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-debug \
--disable-doc \
--enable-gpl \
--enable-libx264 \
--enable-pic \
--extra-cflags="-I${X264_INSTALL_DIR}/include -I${TOOLCHAIN_PATH}/include" \
--extra-ldflags="-L${X264_INSTALL_DIR}/lib -L${TOOLCHAIN_PATH}/lib" \
--strip=${GCC_COMPILER}-strip
# 编译并安装FFmpeg
make -j$(nproc)
make install
# 清理
cd ..
rm -rf ffmpeg-${FFMPEG_VERSION}
rm ffmpeg-${FFMPEG_VERSION}.tar.bz2
echo "FFmpeg has been installed in ${FFMPEG_INSTALL_DIR}"
验证ffmpeg架构
进入到ffmpeg安装目录,同样采用file命令去验证ffmpeg的架构。同样需要输出arm架构。
cd /path/to/ffmpeg/lib(ffmpeg保存目录)
#验证得到的ffmpeg架构
file libavcodec.so.58.35.100
opencv编译
opencv下载
可以去官网下载(或者采用git方法)opencv-4.5.3版本。
opencv_contrib下载
采用git方式下载opencv_contrib,后续需要进行一个版本验证。
#下载opencv_contrib
git clone https://github.com/opencv/opencv_contrib.git
#验证opencv_contrib对应的版本
git checkout 4.5.3
解决ffmpeg始终为NO的问题
问题根源
在编译opencv的时候,使用脚本命令开启-DWITH_FFMPEG=ON,但是实际上会出现ffmpeg为NO的问题,导致opencv 无法链接到ffmpeg。
主要的原因是在opencv中的CMake文件中对于ffmpeg开启需要通过自带的ffmpeg测试文件,使得HAVE_FFMPEG为YES。
解决方法
注释测试部分
# 进入到对应测试部分目录
cd opencv-4.5.3/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()
#直接注释就好了
手动添加ffmpeg 和x264链接
到opencv中的cmake 文件中手动添加ffmpeg和x264链接
link_directories("/path/to/ffmpeg/lib/")
link_directories("/path/to/x264/lib/")
编译安装opencv
#!/bin/bash
set -e
# 设置工具链路径
export TOOLCHAIN_PATH=/path/to/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
export GCC_COMPILER=${TOOLCHAIN_PATH}/bin/arm-linux-gnueabihf
# 清理并创建构建目录
rm -rf build
mkdir build
cd build
# 备份原始路径
export ORIGINAL_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
export ORIGINAL_PATH=$PATH
# 临时移除Anaconda路径
export LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr ':' '\n' | grep -v 'anaconda' | tr '\n' ':' | sed 's/:$//')
export PATH=$(echo $PATH | tr ':' '\n' | grep -v 'anaconda' | tr '\n' ':' | sed 's/:$//')
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/path/to/ffmpeg/lib/pkgconfig
# 配置交叉编译选项
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=arm \
-DCMAKE_C_COMPILER=${GCC_COMPILER}-gcc \
-DCMAKE_CXX_COMPILER=${GCC_COMPILER}-g++ \
-DCMAKE_FIND_ROOT_PATH=${TOOLCHAIN_PATH} \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
-DBUILD_SHARED_LIBS=ON \
-DWITH_FFMPEG=ON \
-DFFMPEG_INCLUDE_DIRS=/path/to/ffmpeg/include \
-DWITH_1394=OFF \
-DWITH_GTK=OFF \
-DWITH_FREETYPE=OFF \
-DWITH_HARFBUZZ=OFF \
-DBUILD_opencv_freetype=OFF \
-DBUILD_opencv_highgui=OFF \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
-DCMAKE_INSTALL_PREFIX=/work/zgmcode/rv1126-YoloV5-Deepsort-master/3rdparty/opencv \
../
# 检查是否生成了Makefile
if [ ! -f "Makefile" ]; then
echo "CMake configuration failed. Makefile not found."
exit 1
fi
# 构建和安装
make -j$(nproc) 2>&1 | tee make_output.log
if [ $? -ne 0 ]; then
echo "Make failed. Check make_output.log for details."
exit 1
fi
make install 2>&1 | tee make_install_output.log
if [ $? -ne 0 ]; then
echo "Make install failed. Check make_install_output.log for details."
exit 1
fi
# echo "OpenCV has been successfully built and installed with FFmpeg and x264 support."
# 还原LD_LIBRARY_PATH和PATH
export LD_LIBRARY_PATH=$ORIGINAL_LD_LIBRARY_PATH
export PATH=$ORIGINAL_PATH