FFmpeg(7.1版本)编译:Ubuntu18.04交叉编译到ARM

一、本地编译与交叉编译

1.本地编译

① 本地编译:指的是在目标系统上进行编译的过程 , 生成的可执行文件和函数库只能在目标系统中使用。

如 :

在 Ubuntu中,本地编译的可执行文件只能在Ubuntu 系统中执行 , 无法在 Windows / Mac / Android / iOS 系统中使用 ;
在 Ubuntu 中 本地编译的函数库 , 只能在Ubuntu本地开发环境中导入并使用

② 本地编译 不涉及跨平台编译 或 跨体系结构编译 , 因此不需要考虑目标系统的差异 ;

跨平台 指的是 不同的操作系统平台
跨体系结构 指的是 不同的 CPU 架构

③ 本地编译 的 编译器 和 编译工具链 与 本地系统的 体系结构 和 操作系统相匹配

本地编译  常用场景 :

在 Ubuntu 中编译 Linux 中使用的 可执行文件 和 函数库 ;
在 Windows 中编译 Windows 中使用的 可执行文件 和 函数库 ;
在 MacOS 中编译 MacOS 中使用的 可执行文件 和 函数库 ;
注意 : Android 和 iOS 必须使用交叉编译 , 无法进行本地编译 ;

2. 交叉编译

① 交叉编译 是在 本地系统 上 编译生成 适用于 另外一种 不同体系结构或操作系统 的 可执行文件 和 函数库 ;

② 交叉编译 使用场景 :

  • 嵌入式系统
  • 移动开发
  • 跨平台开发

③ 交叉编译 需要考虑 不同平台之间的差异 , 包括 体系结构 / 操作系统 / 依赖库 等因素 ;

④ 交叉编译 需要准备的资源 :

  • 交叉编译工具链 : 特定的编译器 , 在 A 系统编译 B 系统的函数库 , 与 B 系统编译 A 系统的函数库 和 A 系统 编译 C 系统的函数库 , 三者所用的 编译器 是不同的 ;
  • 头文件 : 特定交叉编译工具链 自带的 目标系统的 头文件 ;
  • 依赖库 : 特定交叉编译工具链 自带的 目标系统的 依赖库文件 , 需要与头文件匹配 ;

⑤ 在交叉编译中 , 需要使用交叉编译工具链 , 并手动配置编译选项以适应目标系统的要求 , 同时还要提供 符合交叉编译要求的 头文件 和 对应的函数库 ;

二、ARM Linux交叉编译需要的工具

以全志A40I的ARM芯片为例:

1. 找到交叉编译工具包

gcc-linaro-arm.tar.xz

2. 解压交叉编译工具包

3. 解压后产生如下一些文件

4. 相关的交叉编译工具,一般都存放在bin目录下

三、配置FFmpeg(7.1版本)交叉编译工具

1. 交叉编译相关的配置

build_a40i.sh

#! /bin/bashBASE_DIR = /home/jiangjunhua/work/a40i/LinuxCROSS_COMPILE_PATH = $(BASE_DIR)/lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin/CROSS_SYSROOT_PATH = --sysroot=$(BASE_DIR)/lichee/out/sun8iw11p1/linux/common/buildroot/host/usr/arm-buildroot-linux-gnueabihf/sysrootAS              = $(CROSS_COMPILE_PATH)$(CROSS_COMPILE_NAME)as
LD              = $(CROSS_COMPILE_PATH)$(CROSS_COMPILE_NAME)ld
CC              = $(CROSS_COMPILE_PATH)$(CROSS_COMPILE_NAME)gcc $(CROSS_SYSROOT_PATH)
CPP             = $(CC) -E
AR              = $(CROSS_COMPILE_PATH)$(CROSS_COMPILE_NAME)ar
NM              = $(CROSS_COMPILE_PATH)$(CROSS_COMPILE_NAME)nmexport AS LD CC CPP AR NMSYSTEM=`uname` # 用于显示操作系统名称
MY_DIR=`pwd` # 获取当前目录的绝对路径
PREFIX=${MY_DIR}/out # 输出目录,用于存放生成好的二进制文件
cpu_num=`cat /proc/stat | grep cpu[0-9] -c` # 用于获取当前系统的cpu数量
CLONE_GIT_COMMAND="git clone " # git clone# enableShared=[treu/false]
enableShared=true # true编译动态库,false编译静态库(全局配置)startTime=`date +%Y%m%d-%H:%M:%S`
startTime_s=`date +%s`if [ -e "out" ]; thenrm -rf out
fi
mkdir out
mkdir out/bin#. build_pkg_config.sh
#. build_libfdk_aac.sh
#. build_libmp3lame.sh
#. build_libopus.sh
#. build_sdl2.sh
#. build_yasm.sh
#. build_libvpx.sh
#. build_libx264.sh
#. build_libx265.sh# mac --cc=clang
# 禁用编译器优化选项 --disable-optimizations
# 编译libmp3lame需要使用到--extra-cflags和--extra-ldflags属性# build FFmpeg start
PATH=$PATH:$PREFIX/lib # 设置环境变量,将$PREFIX/bin目录下的可执行二进制文件设置进去,方便调用PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig"
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATHFFMPEG="FFmpeg"# 通用配置
COMMON_FFMPEG_CONFIGURE_COMMAND="./configure
--prefix=$PREFIX
--enable-small          # 启用精简模式,减小生成的库的体积
--enable-programs       # 启用生成可执行程序
--enable-avdevice       # 启用音视频设备支持
--enable-encoders       # 启用编码器
--enable-muxers         # 启用复用器
--enable-filters        # 启用滤镜
--enable-cross-compile  # 启用交叉编译
--cross-prefix=$(CC)    # 指定交叉编译工具链的前缀
--sysroot=$(CROSS_SYSROOT_PATH)
--extra-cflags="$FLAGS" # 额外的编译选项 , 用于设定 gcc 编译器的其它编译选项
--arch=arm              # 指定目标体系结构为 ARM
--target-os=linux       # 指定目标操作系统为 Linux--extra-ldflags=-L$PREFIX/lib
--pkg-config-flags="--static"
--extra-libs="-lpthread"
--enable-ffplay
--enable-gpl
--enable-version3
--disable-optimizations
--enable-debug
--enable-nonfree
--enable-filter=delogo
"if [[ "$enableShared" == true  ]]; thenCOMMON_FFMPEG_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"--enable-shared--disable-static"
elseCOMMON_FFMPEG_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"--enable-static--disable-shared"
fi# linux配置
LINUX_FFMPEG_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"
--disable-libx264
--disable-libx265
--disable-libfdk-aac
--disable-libmp3lame
--disable-libopus
--disable-libvpx
"# mac配置
MAC_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"
--enable-libfdk-aac
--enable-libx264
--enable-libmp3lame
--enable-hardcoded-tables
--host-cflags=
--host-ldflags=
--cc=clang
"#FFMPEG_GIT_URL="git@github.com:FFmpeg/FFmpeg.git"#if [ ! -e $FFMPEG ]; then
# echo "==========================clone FFmpeg=========================="
# $CLONE_GIT_COMMAND$FFMPEG_GIT_URL
#fiecho "==========================build ffmpeg=========================="if [[ $SYSTEM == "Darwin" ]]; then$MAC_FFMPEG_CONFIGURE_COMMANDelse$LINUX_FFMPEG_CONFIGURE_COMMANDfimake cleanmake -j${cpu_num}make install
echo "==========================ffmpeg build successful!=========================="endTime=`date +%Y%m%d-%H:%M:%S`
endTime_s=`date +%s`sumTime=$[ $endTime_s - $startTime_s ]echo "Total Compilation Time $sumTime seconds"echo "==========================test ffmpeg!=========================="if [[ "$enableShared" == true  ]]; thenexport LD_LIBRARY_PATH=$MY_DIR/out/lib/cd $MY_DIR/out/bin./ffmpeg -version
elsecd $MY_DIR/out/bin./ffmpeg -version
fi

2. 配置说明

  • --enable-cross-compile 配置 启用 交叉编译 ;
  • ---cross-prefix=$(CC) 配置 交叉编译工具链的前缀 ;
  • --sysroot 配置 交叉编译工具链 的 头文件 和 函数库 搜索路径 ;
  • --extra-cflags="$FLAGS" 配置 gcc / g++ 编译器的 额外选项 ;
  • --arch=arm 配置要编译 arm 架构的 可执行程序 和 函数库 ;
  • --target-os=linux 配置 指定要编译的目标系统为 linux 系统 ;

3. 配置目标 CPU 架构 --arch

--arch 参数 用于配置 目标 CPU 架构 , 常用的 配置值 有 :

  • x86 : 32 位 x86 架构 ;
  • x86_64 / amd64 : 64 位 x86 架构 ;
  • arm : 32 位 ARM 架构 ;
  • arm64 : 64 位 ARM 架构 ;
  • ppc : PowerPC 架构 ;
  • ppc64 : 64 位 PowerPC 架构 ;

4. 配置目标操作系统 --target-os

--target-os 配置 目标操作系统 , 可选的配置选项有 :

  • linux : 编译目标系统是 Linux 操作系统 ;
  • darwin / macosx : 编译目标系统是 macOS 操作系统 ;
  • windows : 编译目标系统是 Windows 操作系统 ;
  • android : 编译目标系统是 Android 操作系统 ;
  • ios : 编译目标系统是 iOS 操作系统 ;

5. 编译

执行脚本 ./build_a40i.sh

四、ffmpeg-7.1的源码和交叉编译的脚本上传到gitee,方便大家参考学习!

gitee地址:ffmpeg: 音视频

commit ed706f9116e831841cc6ea36bb46d605c27a93fb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10403.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创新创业计划书|建筑垃圾资源化回收

目录 第1部分 公司概况........................................................................ 1 第2部分 产品/服务...................................................................... 3 第3部分 研究与开发.................................................…

如何利用天赋实现最大化的价值输出

这种文章,以我现在的实力很难写出来。所以需要引用一些视频。 上92高校容易吗 如果基于天赋努力,非常容易。 如果不是这样,非常非常难。 高考失败人生完蛋?复读考上交大,进入社会才发现学历只是一张纸,98…

LigerUI在MVC模式下的响应原则

LigerUI是基于jQuery的UI框架,故他也是遵守jQuery的开发模式,但是也具有其特色的侦听函数,那么当LigerUI作为View层的时候,他所发送后端的必然是表单的数据,在此我们以俩个div为例: {Layout "~/View…

【力扣】49.字母异位词分组

AC截图 题目 思路 由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。 可以遍历strs,将其中每一个str排序,然后用unodered_ma…

docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull nacos:2.2.4 2、离线包下载 两种方式: 方式一: -)在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -)导出 # 导出镜像到…

【图床配置】PicGO+Gitee方案

【图床配置】PicGOGitee方案 文章目录 【图床配置】PicGOGitee方案为啥要用图床图床是什么配置步骤下载安装PicGoPicGo配置创建Gitee仓库Typora中的设置 为啥要用图床 在Markdown中,图片默认是以路径的形式存在的,类似这样 可以看到这是本地路径&#x…

【C++】类与对象(下)

🦄 个人主页: 小米里的大麦-CSDN博客 🎏 所属专栏: 小米里的大麦——C专栏_CSDN博客 🎁 代码托管: 小米里的大麦的Gitee仓库 ⚙️ 操作环境: Visual Studio 2022 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键…

SpringBoot笔记

1.创建 使用idea提供的脚手架创建springboot项目,选上需要的模块,会自动进行导包 打成jar包,之前直接用原生的maven打包的是一个瘦jar,不能直接跑,把服务器上部署的jar排除在外了,但是现在加上打包查件&am…

Fiddler(一) - Fiddler简介_fiddler软件

文章目录 一、为什么选择Fiddler作为抓包工具? 二、什么是Fiddler?三、Fiddler使用界面简介四、延伸阅读 一、为什么选择Fiddler作为抓包工具? 抓包工具有很多,小到最常用的web调试工具firebug,大到通用性强大的抓包工具wireshark。为什么使用fid…

受击反馈HitReact、死亡效果Death Dissolve、Floating伤害值Text(末尾附 客户端RPC )

受击反馈HitReact 设置角色受击标签 (GameplayTag基本了解待补充) 角色监听标签并设置移动速度 创建一个受击技能,并应用GE 实现设置角色的受击蒙太奇动画 实现角色受击时播放蒙太奇动画,为了保证通用性,将其设置为一个函数,并…

Vue+Echarts 实现青岛自定义样式地图

一、效果 二、代码 <template><div class"chart-box"><chart ref"chartQingdao" style"width: 100%; height: 100%;" :options"options" autoresize></chart></div> </template> <script> …

线段树(Segment Tree)和树状数组

线段树&#xff08;Segment Tree&#xff09;和树状数组 线段树的实现链式&#xff1a;数组实现 解题思路树状数组 线段树是 二叉树结构 的衍生&#xff0c;用于高效解决区间查询和动态修改的问题&#xff0c;其中区间查询的时间复杂度为 O(logN)&#xff0c;动态修改单个元素的…

计算机网络 (62)移动通信的展望

一、技术发展趋势 6G技术的崛起 内生智能&#xff1a;6G将强调自适应网络架构&#xff0c;通过AI驱动的智能算法提升通信能力。例如&#xff0c;基于生成式AI的6G内生智能架构将成为重要研究方向&#xff0c;实现低延迟、高效率的智能通信。信息编码与调制技术&#xff1a;新型…

数据结构 前缀中缀后缀

目录 前言 一&#xff0c;前缀中缀后缀的基本概念 二&#xff0c;前缀与后缀表达式 三&#xff0c;使用栈实现后缀 四&#xff0c;由中缀到后缀 总结 前言 这里学习前缀中缀后缀为我们学习树和图做准备&#xff0c;这个主题主要是对于算术和逻辑表达式求值&#xff0c;这…

音视频多媒体编解码器基础-codec

如果要从事编解码多媒体的工作&#xff0c;需要准备哪些更为基础的内容&#xff0c;这里帮你总结完。 因为数据类型不同所以编解码算法不同&#xff0c;分为图像、视频和音频三大类&#xff1b;因为流程不同&#xff0c;可以分为编码和解码两部分&#xff1b;因为编码器实现不…

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型&#xff0c;用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说&#xff0c;N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意&#xff1a;这…

Windows系统本地部署deepseek 更改目录

本地部署deepseek 无论是mac还是windows系统本地部署deepseek或者其他模型的命令和步骤是一样的。 可以看: 本地部署deepsek 无论是ollama还是部署LLM时候都默认是系统磁盘&#xff0c;对于Windows系统&#xff0c;我们一般不把应用放到系统盘&#xff08;C:&#xff09;而是…

知识库管理如何推动企业数字化转型与创新发展的深层次探索

内容概要 在当今数字化转型的大背景下&#xff0c;知识库管理日益显现出其作为企业创新发展的核心驱动力的潜力。这种管理方式不仅仅是对信息的存储与检索&#xff0c;更是一种赋能&#xff0c;以提升决策效率和员工创造力。企业能够通过系统地整合和管理各类知识资源&#xf…

商品列表及商品详情展示

前言 本文将展示一段结合 HTML、CSS 和 JavaScript 的代码&#xff0c;实现了一个简单的商品展示页面及商品详情&#xff0c;涵盖数据获取、渲染、搜索及排序等功能。 效果展示 点击不同的商品会展示对应的商品详情。 代码部分 代码总体实现 <!DOCTYPE html> <htm…

论文阅读:Realistic Noise Synthesis with Diffusion Models

这篇文章是 2025 AAAI 的一篇工作&#xff0c;主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据&#xff0c;而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…