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

news/2025/2/1 7:53:52 标签: arm开发, ffmpeg

一、本地编译与交叉编译

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/bash

BASE_DIR = /home/jiangjunhua/work/a40i/Linux

CROSS_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/sysroot

AS              = $(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)nm

export AS LD CC CPP AR NM


SYSTEM=`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" ]; then
 rm -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_PATH

FFMPEG="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  ]]; then
 COMMON_FFMPEG_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"
 --enable-shared
 --disable-static
 "
else
 COMMON_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
#fi


echo "==========================build ffmpeg=========================="
 if [[ $SYSTEM == "Darwin" ]]; then
  $MAC_FFMPEG_CONFIGURE_COMMAND
 else
  $LINUX_FFMPEG_CONFIGURE_COMMAND
 fi
 make clean
 make -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  ]]; then
 export LD_LIBRARY_PATH=$MY_DIR/out/lib/
 cd $MY_DIR/out/bin
 ./ffmpeg -version
else
 cd $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.niftyadmin.cn/n/5839163.html

相关文章

使用 Ollama 和 Kibana 在本地为 RAG 测试 DeepSeek R1

作者:来自 Elastic Dave Erickson 及 Jakob Reiter 每个人都在谈论 DeepSeek R1,这是中国对冲基金 High-Flyer 的新大型语言模型。现在他们推出了一款功能强大、具有开放权重的思想链推理 LLM,这则新闻充满了对行业意味着什么的猜测。对于那些…

小程序-基础加强

前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前,我们的项目根目录得有package.json 没有的话,我们就初始化一个 但是我们没有npm这个…

dify实现原理分析-rag-数据检索的实现

数据检索的总体执行步骤 数据检索总体步骤如下: #mermaid-svg-YCRNdSE7T1d0Etyj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YCRNdSE7T1d0Etyj .error-icon{fill:#552222;}#mermaid-svg-YCRNdSE7T1d…

Unet 改进:在encoder和decoder间加入TransformerBlock

目录 1. TransformerBlock 2. Unet 改进 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. TransformerBlock TransformerBlock是Transformer模型架构的基本组件,广泛应用于机器翻译、文本摘要和情感分析等自然语言处理任务…

【开源免费】基于SpringBoot+Vue.JS美食推荐商城(JAVA毕业设计)

本文项目编号 T 166 ,文末自助获取源码 \color{red}{T166,文末自助获取源码} T166,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Elastic Cloud Serverless 获得主要合规认证

作者:来自 Elastic Oliver Mao 我们很高兴地宣布,Elastic Cloud Serverless 已获得多项重要的合规性认证。这一里程碑加强了我们对安全性、隐私性和法规遵从性的承诺。Elastic Cloud Serverless 现已通过以下行业领先框架的审核或认证:SOC 2 …

FFmpeg(7.1版本)的基本组成

1. 前言 FFmpeg 是一个非常流行的开源项目,它提供了处理音频、视频以及其他多媒体内容的强大工具。FFmpeg 包含了大量的库,可以用来解码、编码、转码、处理和播放几乎所有类型的多媒体文件。它广泛用于视频和音频的录制、转换、流媒体传输等领域。 2. F…

前端学习-事件解绑,mouseover和mouseenter的区别(二十九)

目录 前言 解绑事件 语法 鼠标经过事件的区别 鼠标经过事件 示例代码 两种注册事件的区别 总结 前言 人道洛阳花似锦,偏我来时不逢春 解绑事件 on事件方式,直接使用null覆盖就可以实现事件的解绑 语法 btn.onclick function(){alert(点击了…