Shell生成支持x264的ffmpeg安卓全平台so

安卓 FFmpeg系列

第一章 Ubuntu生成ffmpeg安卓全平台so
第二章 Windows生成ffmpeg安卓全平台so
第三章 生成支持x264的ffmpeg安卓全平台so(本章)


文章目录

  • 安卓 FFmpeg系列
  • 前言
  • 一、实现步骤
    • 1、下载x264源码
    • 2、交叉编译生成.a
    • 3、加入x264配置
    • 4、编译ffmpeg
  • 二、完整代码
  • 三、生成好的包
  • 四、使用示例
    • 1、基本用法
      • (1)查看用法
      • (2)确认ffmpeg版本
      • (3)生成so
    • 2、ubuntu中使用
    • 3、windows msys2中使用
  • 总结


前言

前两张实现了ffmpeg全平台so的生成,但是ffmpeg依赖的第三方库是需要另外编译的,所以本章将提供编译x264库并加入ffmpeg的方法。本章提供的脚本在ubuntu以及windows的wsl、msys2都适用。


一、实现步骤

定义交叉编译相关变量

#ndk api版本 -可配置
API=24
#cpu 架构 -可配置 :armv7-a、armv8-a、i686、x86-64
CPU=x86-64
#msys则可设置为windows
OS=linux
#需要ANDROID_NDK_HOME指定ndk目录
TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/$OS-x86_64
echo $TOOLCHAIN
SYSROOT=$TOOLCHAIN/sysroot
PREFIX=$(pwd)/output/ffmpeg${FFMPEG_VERSION}/${API}/${CPU}
PACKAGE_PREFIX=$PACKAGE_SOURCE_DIR/.output/${API}/${CPU}
export CC=${CROSS_PREFIX}clang
export CXX=${CROSS_PREFIX}clang++
case $CPU in
armv7-a)ARCH=armCROSS_PREFIX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-;;
armv8-a)ARCH=arm64CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android$API-;;
i686)ARCH=x86CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android$API-FFMPEG_EXTRA_CONFIGURE_FLAGS=--disable-asm;;
x86-64)ARCH=x86_64CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android$API-;;

1、下载x264源码

 wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2tar -xf $PACKET_X264.tar.bz2

2、交叉编译生成.a

在x264源码目录执行如下操作。其中X264_OUTPUT_DIR 为输出目录,ARCH为cpu架构

./configure \--prefix=$X264_OUTPUT_DIR \--enable-static \--enable-pic \--host=$ARCH-linux \--disable-opencl \--disable-cli \--cross-prefix=$CROSS_PREFIX \--sysroot=$SYSROOT \FFMPEG_EXTRA_CONFIGURE_FLAGS
make -j$(nproc) 
make install

3、加入x264配置

FFMPEG_EXTRA_CFLAGS="$FFMPEG_EXTRA_CFLAGS -I$X264_OUTPUT_DIR/include"
FFMPEG_EXTRA_LDFLAGS="$FFMPEG_EXTRA_LDFLAGS -L$X264_OUTPUT_DIR/lib"
FFMPEG_EXTRA_CONFIGURE_FLAGS="$FFMPEG_EXTRA_CONFIGURE_FLAGS --enable-encoder=libx264 --enable-libx264"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$X264_OUTPUT_DIR/lib/pkgconfig"

4、编译ffmpeg

 ./configure --target-os=android \--prefix=$PREFIX \--arch=$ARCH \--cpu=$CPU \--cc=$CC \--cxx=$CXX \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--enable-gpl \--cross-prefix=$CROSS_PREFIX \--enable-cross-compile \--enable-jni \--enable-mediacodec \--enable-decoder=h264_mediacodec \--enable-decoder=hevc_mediacodec \--enable-decoder=vp8_mediacodec \--enable-decoder=vp9_mediacodec \--enable-decoder=mpeg2_mediacodec \--enable-decoder=mpeg4_mediacodec \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic -DVK_ENABLE_BETA_EXTENSIONS=0 -march=$CPU $FFMPEG_EXTRA_CFLAGS" \--extra-ldflags="$FFMPEG_EXTRA_LDFLAGS" \--pkg-config="pkg-config --static" \$SHARED_OR_STATIC_FLAG \$FFMPEG_EXTRA_CONFIGURE_FLAGS
make -j$(nproc)
make install

二、完整代码

下列代码可以在ubuntu、wsl ubuntu、msys2中执行。无需任何额外操作,只需调用脚本即可生成so。可以指定cpu、安卓api、以及ffmpeg版本号。如果没有指定ANDROID_NDK_HOME会自动下载ndk,x264源码也会自动下载以及ffmpeg源码也会自动下载,然后自动生成so。同时还会生成ffmpeg.so,是ffmpeg可执行程序,笔者将其生成了so,其内包含的main符号可以直接调用,以输入命令行
注:合并所有库到libffmpeg.so的方式本文暂不提供。
下列代码可复制保存为build.sh直接执行。

set -e
show_usage() {echo "usage:-p is cpu (armv7-a、armv8-a、i686、x86-64) -a is android api number-f is ffmpeg version-h is help"
}
#ffmpeg版本 -可配置
FFMPEG_VERSION=4.3.6
#ndk api版本 -可配置
API=24
#cpu 架构 -可配置 :armv7-a、armv8-a、i686、x86-64
CPU=x86-64
while getopts "p:a:f:h" arg; docase $arg inp)CPU=$OPTARG;;a)API=$OPTARG;;f)FFMPEG_VERSION=$OPTARG;;h)show_usageexit 1 ;;?)echo "unkonw argument"show_usageexit 1;;esac
done
OS=$(uname -o)
echo $OS
if [ $OS == "Msys" ]; thenOS="windows"NDK_URL="https://googledownloads.cn/android/repository/android-ndk-r26d-windows.zip"NDK_SHA1="c7ea35ffe916082876611da1a6d5618d15430c29"
elseOS="linux"NDK_URL=" https://googledownloads.cn/android/repository/android-ndk-r26d-linux.zip"NDK_SHA1="fcdad75a765a46a9cf6560353f480db251d14765"fi
echo "************************************Build Info*********************************"
echo "Host os :$OS"
echo "Target cpu :$CPU"
echo "Android api :$API"
echo "FFmpeg version :$FFMPEG_VERSION"
echo "************************************Build Info End*****************************"
PACKAGE_SOURCE_DIR=$(pwd)/.package
#下载NDK
if [ ! -d "$PACKAGE_SOURCE_DIR" ]; thenmkdir $PACKAGE_SOURCE_DIR
fi
if [ ! -d "$ANDROID_NDK_HOME" ]; thenpushd $PACKAGE_SOURCE_DIRif [ ! -d "ndk" ]; thenif [ -e "ndk.zip" ]; thensha1=$(sha1sum ndk.zip)fisha1=($sha1)echo "${sha1[0]}"if [ "$sha1" != "$NDK_SHA1" ]; thenif [ -e "ndk.zip" ]; thenrm ndk.zipfiecho ndk Downloading...wget $NDK_URL -O ndk.zipexit 1fiif [ -d "ndk" ]; thenrm -rf ndkfiunzip ndk.zip -d ndkfiANDROID_NDK_HOME=$PACKAGE_SOURCE_DIR/ndk/$(ls ndk)popd
fi
#下载NDK -end
TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/$OS-x86_64
echo $TOOLCHAINSYSROOT=$TOOLCHAIN/sysroot
case $CPU in
armv7-a)ARCH=armCROSS_PREFIX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-USR_LIB=$SYSROOT/usr/lib/armv7a-linux-androideabi/$API;;
armv8-a)ARCH=arm64CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android$API-USR_LIB=$SYSROOT/usr/lib/aarch64-linux-android/$API;;
i686)ARCH=x86CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android$API-USR_LIB=$SYSROOT/usr/lib/i686-linux-android/$APIFFMPEG_EXTRA_CONFIGURE_FLAGS=--disable-asm;;
x86-64)ARCH=x86_64CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android$API-USR_LIB=$SYSROOT/usr/lib/x86_64-linux-android/$API;;
esac
PREFIX=$(pwd)/output/ffmpeg${FFMPEG_VERSION}/${API}/${CPU}
PACKAGE_PREFIX=$PACKAGE_SOURCE_DIR/.output/${API}/${CPU}
export CC=${CROSS_PREFIX}clang
export CXX=${CROSS_PREFIX}clang++
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
#x264
pushd $PACKAGE_SOURCE_DIR
PACKET_X264=x264-master
X264_OUTPUT_DIR=$PACKAGE_PREFIX/x264
FFMPEG_EXTRA_LINK_LIBRARY="$FFMPEG_EXTRA_LINK_LIBRARY $X264_OUTPUT_DIR/lib/libx264.a"
FFMPEG_EXTRA_CFLAGS="$FFMPEG_EXTRA_CFLAGS -I$X264_OUTPUT_DIR/include"
FFMPEG_EXTRA_LDFLAGS="$FFMPEG_EXTRA_LDFLAGS -L$X264_OUTPUT_DIR/lib"
FFMPEG_EXTRA_CONFIGURE_FLAGS="$FFMPEG_EXTRA_CONFIGURE_FLAGS --enable-encoder=libx264 --enable-libx264"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$X264_OUTPUT_DIR/lib/pkgconfig"
if [ ! -e "$X264_OUTPUT_DIR/lib/libx264.a" ]; thenif [ ! -d "$PACKET_X264" ]; thenecho x264 Downloading...wget https://code.videolan.org/videolan/x264/-/archive/master/x264-master.tar.bz2tar -xf $PACKET_X264.tar.bz2fiif [ "$ARCH" != "x64" ]; thenPACKET_X264_EXTRA_CONFIGURE_FLAG="--disable-asm"fiecho x264 Configuring...pushd $PACKET_X264./configure \--prefix=$X264_OUTPUT_DIR \--enable-static \--enable-pic \--host=$ARCH-linux \--disable-opencl \--disable-cli \--cross-prefix=$CROSS_PREFIX \--sysroot=$SYSROOT \$PACKET_X264_EXTRA_CONFIGURE_FLAGecho x264 Building...if [ -e "Makefile" ]; thenmake cleanfimake -j$(nproc) -secho x264 Installing...make installpopdpopd
fi
#x264 -end
#ffmpeg
pushd $PACKAGE_SOURCE_DIR
FFMPEG_SOURCE_DIR=$(pwd)/ffmpeg$FFMPEG_VERSION
if [ ! -d "$FFMPEG_SOURCE_DIR" ]; thenecho ffmpeg Downloading...git clone -b n$FFMPEG_VERSION --depth 1 https://git.ffmpeg.org/ffmpeg.git $FFMPEG_SOURCE_DIRtar -xf $PACKET_X264.tar.bz2
fi
pushd $FFMPEG_SOURCE_DIR
build_ffmpeg() {#./configure -h# echo ffmpeg surport decoders...# ./configure --list-decoders# echo ffmpeg surport hwaccels...# ./configure --list-hwaccelsecho ffmpeg Configuring..../configure --target-os=android \--prefix=$PREFIX \--arch=$ARCH \--cpu=$CPU \--cc=$CC \--cxx=$CXX \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--enable-gpl \--cross-prefix=$CROSS_PREFIX \--enable-cross-compile \--enable-jni \--enable-mediacodec \--enable-decoder=h264_mediacodec \--enable-decoder=hevc_mediacodec \--enable-decoder=vp8_mediacodec \--enable-decoder=vp9_mediacodec \--enable-decoder=mpeg2_mediacodec \--enable-decoder=mpeg4_mediacodec \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic -DVK_ENABLE_BETA_EXTENSIONS=0 -march=$CPU $FFMPEG_EXTRA_CFLAGS" \--extra-ldflags="$FFMPEG_EXTRA_LDFLAGS" \--pkg-config="pkg-config --static" \$SHARED_OR_STATIC_FLAG \$FFMPEG_EXTRA_CONFIGURE_FLAGSecho ffmpeg Building...if [ -e "Makefile" ]; thenmake cleanfimake -j$(nproc)echo ffmpeg Installing...make install
}
# SHARED_OR_STATIC_FLAG="--disable-shared --enable-static"
# echo "ffmpeg build static library"
# build_ffmpeg
SHARED_OR_STATIC_FLAG="--enable-shared  --disable-static"
echo "ffmpeg build shared library"
build_ffmpeg
$CC -shared -fPIC \$(find $FFMPEG_SOURCE_DIR/fftools -name '*.c' -and -not -name 'ffplay.c' -and -not -name 'ffprobe.c' -and -not -name 'ffplay_renderer.c' -and -not -name 'ffmpeg_qsv.c' -and -not -name 'ffmpeg_videotoolbox.c') \-I$FFMPEG_SOURCE_DIR -lm \$(find $PREFIX/lib -name "*.so" -type f -print) \-o $PREFIX/lib/ffmpeg.so
popd
popd
echo "Generated files in: $PREFIX"
#ffmpeg -end

三、生成好的包

已加入第二章生成好的包里。


四、使用示例

1、基本用法

创建一个ffmpeg-android目录,将完整代码可复制保存为build.sh

(1)查看用法

./build.sh -h

在这里插入图片描述

(2)确认ffmpeg版本

ffmpeg版本参考:https://git.ffmpeg.org/ffmpeg.git 去掉前缀n
在这里插入图片描述

(3)生成so

生成全平台、api24、ffmpeg6.1.1的so

arm

./build.sh -p armv7-a -a 24 -f 6.1.1

arm64

./build.sh -p armv8-a -a 24 -f 6.1.1

x86

./build.sh -p i686 -a 24 -f 6.1.1

x64

./build.sh -p x86-64 -a 24 -f 6.1.1

生成好的so在build.sh脚本所在目录的output文件夹下
在这里插入图片描述

2、ubuntu中使用

wsl、虚拟机都可以。参考第一章安装必要的工具。

sudo apt install git unzip
./build.sh -p armv7-a -a 24 -f 6.1.1

3、windows msys2中使用

在msys2生成需要参考第二章配置环境,以及安装必要的工具。

pacman -S unzip git
./build.sh -p armv7-a -a 24 -f 6.1.1

总结

以上就是今天讲述的内容,生成ffmpeg安卓so其实并不难,如果熟悉交叉编译以及shell,编译起来还是比较简单的,尤其是想生成最小或者完整依赖的包,最好还是自己生成。

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

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

相关文章

Redis 哨兵机制

文章目录 哨兵机制概念相关知识铺垫主从复制缺陷哨兵工作流程选举具体流程理解注意事项 哨兵机制概念 先抽象的理解,哨兵就像是监工,节点不干活了,就要有行动了。 Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务&#…

MVC WebAPI

创建项目 创建api控制器 》》》 web api 控制器要继承 ApiController 》》》 数据会自动装配 及自动绑定 》》》清除xml返回格式 //清除XML返回格式 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 》》》跨越问题

【汇编语言小练习输入两个数字然后输出它们的和】

这个程序是用汇编语言编写一个简单的程序,它将从键盘输入两个数字,然后输出它们的和。 .MODEL SMALL .STACK 100H.DATAINPUT_MSG1 DB Enter the first number: $INPUT_MSG2 DB 13, 10, Enter the second number: $RESULT_MSG DB 13, 10, The sum is: $N…

2024服贸会,参展企业媒体宣传报道攻略

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 2024年中国国际服务贸易交易会(简称“服贸会”)是一个重要的国际贸易平台,对于参展企业来说,有效的媒体宣传报道对于提升品牌知名度、扩大…

FPGA第二篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介:首先,FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器,可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务,可以说是系统的"大脑"和"加速引擎&qu…

社区奶柜:小本创业,大有可为

社区奶柜:小本创业,大有可为 在快节奏的现代生活中,人们对健康、便捷生活方式的追求日益增长。社区奶柜加盟项目,正是应运而生,它不仅满足了居民对于新鲜、营养乳制品的日常需求,也为寻求创业机会的您铺设…

excel中图片url转为jpg

步骤 打开Excel,并按下 Alt F11 打开VBA编辑器。在VBA编辑器中,插入一个新的模块(右键点击项目资源管理器中的模块 -> 插入 -> 模块)。在新模块的代码窗口中,复制并粘贴以下示例代码。根据需要修改代码中的变量…

力扣2105---给植物浇水II(Java、模拟、双指针)

题目描述: Alice 和 Bob 打算给花园里的 n 株植物浇水。植物排成一行,从左到右进行标记,编号从 0 到 n - 1 。其中,第 i 株植物的位置是 x i 。 每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐,最初是…

AS01_BAPI:BAPI_FIXEDASSET_OVRTAKE_CREATE_创建资产主数据

AS01_创建资产主数据 一、功能介绍 使用事务码AS01创建资产主数据 二、程序代码 程序代码: REPORT zfir002.TYPE-POOLS: slis, icon. TYPES: BEGIN OF ty_file,zanln TYPE anla-anln1, "资产编号anln2 TYPE anla-anln2, "资产次级编号bukrs …

FastAPI vs Flask: 选择最适合您的 Python Web 框架

文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域,FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能,但是在某些方面有所不同。本文将比较 FastAPI 和…

Ubuntu 下串口工具:Minicom、CuteCom 和 Screen

在 Ubuntu 中,对于串口通信工具的选择,虽然没有一个绝对的 “最好用” 的排名,但根据用户反馈和工具的流行程度,Minicom、CuteCom 和 Screen 这三个工具通常被认为是较为受欢迎和实用的。 一、简介: Minicom&#xff…

【论文笔记】KAN: Kolmogorov-Arnold Networks 全新神经网络架构KAN,MLP的潜在替代者

KAN: Kolmogorov-Arnold Networks code:https://github.com/KindXiaoming/pykan Background ​ 多层感知机(MLP)是机器学习中拟合非线性函数的默认模型,在众多深度学习模型中被广泛的应用。但MLP存在很多明显的缺点:…

跨协议通讯无缝对接:Modbus-BACnet楼宇智能转换器深度解析

在现代化的建筑群里,智能楼宇管理系统如同神经系统,协调着各设备的运行。某大型商业综合体,集购物中心、办公区、酒店于一体,面对着来自不同供应商的设备,如何实现统一管理和高效通讯成了首要挑战。特别是其内部既有采…

ADC模-数转换原理与实现

1. 今日摸鱼计划 今天来学习一下ADC的原理,然后把ADC给实现 ADC芯片:ADC128S102 视频: 18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili 18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili 18C_基于线性序列机的S…

neo4j-5.11.0安装APOC插件or配置允许使用过程的权限

在已经安装好neo4j和jdk的情况下安装apoc组件,之前使用neo4j-community-4.4.30,可以找到配置apoc-4.4.0.22-all.jar,但是高版本neo4j对应没有apoc-X.X.X-all.jar。解决如下所示: 1.安装好JDK与neo4j 已经安装对应版本的JDK 17.0…

MySQL数据库及数据表的创建

1.创建一个名叫 db_classes 的数据库: 创建一个叫 db_classes 的数据库MySQL命令: create database db_classes; 运行效果: 创建数据库后查看该数据库基本信息MySQL命令: show create database db_classes; 运行效果&#xff…

力扣刷题--数组--第三天

今天再做两道二分查找的题目,关于二分查找的知识可看我前两篇博客。话不多说,直接开干! 题目1:69.x 的平方根 题目详情:   给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数&#…

VScode通过ssh远程连接服务器被拒绝:permission denied, please try again

使用场景: 使用windows系统下的vscode远程连接服务器的linux系统,终端提示permission denied, please try again,但是使用cmd是可以远程登录的。 解决办法: 前提条件windows端的vscode安装了ssh远程连接的相关插件Remote - SSH,…

Django之rest_framework(六)

一、GenericViewSet类的使用 继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于视图的开发 1.1、代码 from rest_framework.viewsets import GenericViewSet from rest_framework.response import Response from rest_framework …

Duplicate File Finder Pro for Mac激活版:重复文件清理软件

在繁杂的文件管理中,你是否曾为重复文件而烦恼?Duplicate File Finder Pro for Mac,正是你不可或缺的得力助手。这款专业级工具,能够迅速扫描并定位Mac系统中的重复文件,让你的存储空间恢复清爽。 通过强大的算法支持&…