(详细使用指南)Linux下交叉编译带ffmpeg的opencv并移植到RK3588等ARM端

一 问题背景

      

  瑞芯微RK3588等嵌入式板作为边缘端设备为算法模型的部署提供了便利,目前很多分类或好检测模型针对边缘端做了优化或量化,使得在边缘端也能达到实时稳定的识别和检测效果。
        但嵌入式设备普遍的flash emmc不大,一般在32G左右,如果在嵌入式设备进行大量的编译操作很容易空间不足。通过交叉编译的方式避免文件包在嵌入式上编译,可以通过在x86 PC端等进行交叉编译,然后将编译好的文件夹拷贝到ARM设备平台上。

交叉编译是指在一台计算机上生成目标平台的可执行程序。通常情况下,我们在开发软件时会在同一平台上编译、运行程序,但有时候需要将程序部署到不同体系结构或操作系统的设备上运行,这就需要使用交叉编译工具链来生成适用于目标平台的可执行文件。常见的应用场景包括在开发嵌入式系统、移动应用程序或跨平台软件时进行交叉编译。


二 问题描述

        需要将一个类似于CNStream的框架移植到RK3588板子上,跑通示例模型,其中需要用到交叉编译后的带ffmeg的opencv,读取示例MP4视频,作为模型算法输入数据,完成框架移植与测试。


三 环境准备

-linux系统:unbuntu18.04 X86_64
-rk3588软件包:rknn-toolkit2:1.5.2-cp36
-交叉编译工具:gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
-硬件平台:寒武纪MLU270

1 创建docker虚拟环境

docker创建命令如下:

	docker run -it --privileged --name NewF3588 -p 35886:22 -v /home/lc/hang/rk3588:/workspace/hang/rk3588  rknn-toolkit2:1.5.2-cp36  /bin/bash

2 搭建交叉编译环境

step1:交叉编译工具链下载

下载交叉编译工具链,将交叉编译工具放置在docker虚拟环境中,比如/opt目录下改名gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu为aarch64-rockchip-linux-gnu  

step2: 设置交叉编译环境变量

关于linux下环境变量的设置,可看此处博文https://blog.csdn.net/xishining/article/details/119283522

通过vim ~/.bashrc命令打开环境变量配置文件,主要是添加lib、lib64余bin文件

在文件最后添加:  

 export LD_LIBRARY_PATH=/opt/aarch64-rockchip-linux-gnu/lib:/opt/aarch64-rockchip-linux-gnu/lib64:$LD_LIBRARY_PATH
export PATH=$PATH:/opt/aarch64-rockchip-linux-gnu/bin

添加后保存并 source ~/.bashrc

验证交叉编译环境是否搭建成功,在任意目录执行命令:

aarch64-none-linux-gnu-gcc -v

 若返回gcc版本号,则表示成功。


 四 源码下载与安装

1 两个必要的软件包
apt-get install build-essential pkg-config
2 cmake3.23.0

https://cmake.org/download/

3 opencv-4.5.1

https://opencv.org/releases/page/2/

4 opencv_contrib-4.5.1

https://github.com/opencv/opencv_contrib/releases/tag/4.5.1

5 ffmpeg-4.2.9

https://ffmpeg.org/download.html#releases


以上软件下载源码后,解压至/opt目录下,并先创键/arm/fffmpeginstall夹用于后续存放ffmeg相关配置文件


五 源码编译

1 cmake源码编译

cmake --version检查是否安装成功

2 ffmepg交叉编译
#在/opt目录下依次执行以下命令:
 cd ffmpeg-4.2.9
#不带x264的ffmpeg编译
#注意修改--cross-prefix,--cc,--cxx,--prefix为自己相关文件路径,其他不变
./configure --enable-cross-compile --target-os=linux --arch=aarch64 \
--cross-prefix=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu- \
--cc=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-gcc \
--cxx=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-g++ \
--prefix=/opt/arm/fffmpeginstall \
--disable-asm --enable-parsers --disable-decoders --enable-decoder=h264 --disable-debug --enable-ffmpeg --enable-shared --disable-static --disable-stripping --disable-doc
#带x264的ffmpeg编译
./configure --enable-cross-compile --target-os=linux --arch=aarch64 \
--cross-prefix=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu- \
--cc=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-gcc \
--cxx=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-g++ \
--prefix=/opt/arm/fffmpeginstall \
--extra-cflags=-I/opt/arm/fffmpeginstall/include \
--extra-ldflags=-L/opt/arm/fffmpeginstall/lib \
--disable-asm --enable-parsers --disable-decoders --enable-decoder=h264 --disable-debug --enable-ffmpeg --enable-shared --disable-static --disable-stripping --disable-doc --enable-libx264 --enable-gpl

执行make命令编译,并查看是否编译成功,有无报错。

make -j$(nproc)

make install

然后进入你的--prefix目录,查看生成的文件(bin,include,lib,share)
在/opt/arm/fffmpeginstall//bin目录下执行,file libavcodec.so.60.35.100命令,若出现aarch64则表示ffmpeg交叉编译成功

设置ffmpeg的环境变量(这里是设置的临时的环境变量):
    export PKG_CONFIG_PATH=/opt/arm/fffmpeginstall/lib/pkgconfig$PKG_CONFIG_PATH
    export PKG_CONFIG_LIBDIR=/opt/arm/fffmpeginstall/lib$PKG_CONFIG_LIBDIR
    export LD_LIBRARY_PATH=/opt/arm/fffmpeginstall/lib:$LD_LIBRARY_PATH
    export 查看环境变量格式是否正确

进入/opt/aarch64-rockchip-linux-gnu/aarch64-none-linux-gnu/libc/usr路径下,将ffmpeg生成的文件(bin,include,lib,share目录下的文件)分别对应复制到
usr目录下bin,include,lib,share文件夹中

3 opencv&opencv_contrib交叉编译

STEP1:先把opencv_contrib源码复制到opencv源码目录下

STEP2:进入opencv源码目录,进行以下操作:

        mkdir build 用于存放cmake的生成文件
        mkdir install用于存放opencv交叉编译的生成文件夹,
        vim tool_chain.cmake 创键交叉编译工具链文件
 

#修改tool_chain.cmake文件,添加以下内容(注意修改相关路径):
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR aarch64 )
set( CMAKE_C_COMPILER /opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-gcc)
set( CMAKE_CXX_COMPILER /opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-g++)
#set( OPENCV_ENABLE_PKG_CONFIG ON)
#set( CMAKE_C_FLAGS "-Wl,-rpath-link=/opt/arm/fffmpeginstall/lib")
set( CMAKE_FIND_ROOT_PATH "/opt/arm/fffmpeginstall/lib" )
set( CMAKE_CXX_FLAGS "-Wl,-rpath=/opt/arm/fffmpeginstall/lib")
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

保存后关闭 tool_chain.cmake文件。

STEP3:进入opencv源码根目录,进入build文件夹,执行以下命令:

cmake -DCMAKE_INSTALL_PREFIX=../install \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.1/modules \
-DWITH_FFMPEG=ON \
-DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..

出现ffmpeg YES 表示链接ffmpeg成功,然后执行make命令编译生成

make -j$(nproc)

make install

六 应用说明

一般应用:

最后在opencv源码根目录install文件夹下将include和lib里的文件分别拷贝到ARM板的/usr/include 和/usr/lib下 然后打开终端执行可执行文件即可。

本例应用:

最后在opencv源码根目录install文件夹下将include和lib里的文件分别替换框架程序原opencv源码,交叉编译并将生成的文件放到目标嵌入式板子上。

因为采用的是opnecv硬编码ffmpeg,所以需要将前文中ffmpeg编译生成的bin,include,lib,share文件夹放到目标RK3588板上。并设置临时环境变量。


#环境变量设置:
#环境变量查询命令:
echo $PATH
echo $LD_LIBRARY_PATH
echo $PKG_CONFIG_PATH
echo $PKG_CONFIG_LIBDIR

#RK3588板子:
#ffmpeg库:
#在板子环境下的/opt目录下新建/arm/fffmpeginstall目录,用于放置ffmpeg的四个文件夹
export PATH=$PATH:/opt/arm/fffmpeginstall/bin
export LD_LIBRARY_PATH=/opt/arm/fffmpeginstall/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/opt/arm/fffmpeginstall/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_LIBDIR=/opt/arm/fffmpeginstall/lib:$PKG_CONFIG_LIBDIR

敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,OpenCV,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 我将领大家一起来学习OpenCV4的图像处理原理和编程知识,并动手操练58案例代码。具体内容包括: 一、小白入门与初体验:禁果尝鲜二、图像基本操作:懵懵懂懂学图像三、图像统计操作:七七八八有收获四、图像卷积:不入虎穴焉得虎子五、磨皮美颜:柳暗花明又一村六、二值图像:阴阳合一法自然七、图像形态学:登高望远天地阔 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。     
交叉编译FFmpeg是指在一台计算机上为另一种不同系统或架构编译FFmpeg库。这种方法通常用于为嵌入式设备或其他特定平台生成可执行文件。引用提供了在Windows下编译FFmpeg详细步骤,而引用则介绍了如何使用VS2019编译有libx264和libmp3lame的FFmpeg库。具体步骤如下: 1. 下载FFmpeg源代码:可以通过引用提供的GitHub仓库链接下载FFmpeg源代码。 2. 配置交叉编译环境:根据目标平台的不同,需要配置相应的交叉编译环境。这涉及到安装交叉编译工具链、设置环境变量等。 3. 配置FFmpeg编译选项:根据需要,可以通过修改配置文件或使用命令行参数来配置编译选项。例如,可以指定需要编译的模块、库等。 4. 执行编译命令:使用命令行工具进入FFmpeg源代码目录,执行编译命令进行交叉编译。具体的编译命令可以参考引用和引用中的示例。 需要注意的是,交叉编译FFmpeg可能存在一些特定的问题和挑战,例如平台差异、依赖库的配置等。因此,在进行交叉编译之前,建议仔细阅读相关文档和参考资料,并根据具体情况进行相应的调整和配置。 总结起来,交叉编译FFmpeg涉及下载源代码、配置交叉编译环境、配置编译选项以及执行编译命令等步骤。具体的步骤和细节可以根据目标平台和需求进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值