【使用Ubuntu编译FFmpeg生成Android动态库/静态库】

环境

我这里使用windows里的wsl2的ubuntu,使用物理机或者vmware,vbox之类的安装的ubuntu理论上也可以.

gcc编译使用的环境如下:

Ndk使用17

FFmpeg使用4.0.2.

clang编译使用的环境如下:

Ndk使用21.4

FFmpeg使用6.1

FFmpeg下载地址:https://ffmpeg.org/releases/

Ndk下载地址在Android官网

准备

把下载到的FFmpeg,ndk解压,注意ndk下载的是linux版本的,因为接下来会在ubuntu下编译

编写编译脚本

由于Ndk在17或以下的版本默认使用Gcc编译而17以上的版本使用Clang所以这里介绍两种编译方式。

Gcc编译

编写sh脚本

由于编译的命令并非一两条命令可以完成的所以我们需要使用.sh脚本保存起来,编写完成之后执行该脚本

在ffmpeg源码根目录新建一个.sh后缀的文件,我这里的命名为ffbuild.sh。以下为该文件的内容

powershell 复制代码
# NDK目录
NDK_ROOT=/mnt/c/Users/Administrator/ubuntu_dev/ndk/android-ndk-r17c/android-ndk-r17c
# ndk对应平台编译器所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

PREFIX=./android/ffmpeg

./configure \
--prefix=$PREFIX \
--disable-x86asm \
--enable-small \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$NDK_ROOT/platforms/android-23/arch-arm \
--extra-cflags="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=23 -U_FILE_OFFSET_BITS  -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -O0 -fPIC" \
--arch=arm \
--target-os=android 

make clean
make -j20 install

以上命令的一些解释:

PREFIX:你编译好的库输出的目录

--PREFIX=./android/ffmpeg

指定输出路径

--enable-small

优化大小

--disable-programs

不编译ffmpeg程序(命令行工具)

----disable-avdevice

关闭avdevice模块 在安卓中无用

--disable-encoders

关闭所有编码器

--disable-filter

关闭所有滤镜

--enable-cross-compile

开启交叉编译

--cross-prefix

查找ndk的gcc(编译器)

--sysroot

寻找ndk所有的库文件

--disable-shared

关闭动态库输出

--extra-cflags

传给编译器的参数

--arch=arm

如果编译的是64位库则写成arm64

--target-os=android

目标系统

make clean

每次编译前都清理上一次运行产生的文件

make -j20 install

-j20的意思是并行20个线程,推荐写成你的cpu核心数

编译64位略有不同:

powershell 复制代码
# NDK目录
NDK_ROOT=/mnt/c/Users/Administrator/ubuntu_dev/ndk/android-ndk-r17c/android-ndk-r17c
# ndk对应平台编译器所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64

PREFIX=./android/ffmpeg64

./configure \
--prefix=$PREFIX \
--disable-x86asm \
--enable-small \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--sysroot=$NDK_ROOT/platforms/android-23/arch-arm64 \
--extra-cflags="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/aarch64-linux-android -D__ANDROID_API__=23 -U_FILE_OFFSET_BITS -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv8-a -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC" \
--arch=aarch64 \
--target-os=android \
--enable-shared


make clean
make -j20 install

执行命令

powershell 复制代码
sudo sh xxx.sh

编译结果

很多时候会报错,一般报错之后都是编译失败了。可以停止编译,查看输出的信息去修改对应的命令。

如果控制台输出的信息判断不了是什么问题可以查看编译日志(以我这里为例):./ffbuild/config.log。

很多时候就是因为编译的命令路径问题或者版本问题导致的,有时候也因为linux发行版依赖的一些库缺失。

Clang编译

Clang编译与gcc编译基本一致,这里我们使用Ndk21.4和当下最新的FFmpeg6.1为例

编写sh脚本

与上面一致编写shell:

powershell 复制代码
# NDK目录
NDK_ROOT=/mnt/c/Users/Administrator/ubuntu_dev/ndk/android-ndk-r21e
# ndk对应平台编译器所在目录
TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
# 需要编译出的平台,这里是 arm64-v8a
ARCH=aarch64

# 支持的最低 Android API
API=23

PREFIX=./android/ffmpeg64

  ./configure \
  --target-os=android \
  --prefix=$PREFIX \
  --arch=$ARCH \
  --sysroot=$TOOLCHAIN/sysroot \
  --disable-static \
  --disable-ffmpeg \
  --disable-ffplay \
  --disable-ffprobe \
  --disable-debug \
  --disable-doc \
  --disable-avdevice \
  --enable-shared \
  --enable-cross-compile \
  --cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
  --cc=$TOOLCHAIN/bin/aarch64-linux-android$API-clang \
  --cxx=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ \
  --extra-cflags="-fpic"

make clean all
make -j20 install

可见这里的脚本与上面差不多,只是编写更加规范,常修改的值都提取出来作为变量,方便日后修改编译

现成的FFmpeg库

这里提供作者自己编译好的FFmpeg供大家直接使用:

https://download.csdn.net/download/javy_codercoder/88661461

相关推荐
努力的小T4 小时前
Debian操作系统相对于Ubuntu有什么优势吗?
linux·运维·服务器·ubuntu·centos·云计算·debian
m0_748256145 小时前
【全栈开发】----用pymysql库连接MySQL,批量存入
android·数据库·mysql
陈序缘5 小时前
Ubuntu下PyTorch开发环境配置
linux·pytorch·ubuntu·职场和发展
Fre丸子_5 小时前
ffmpeg之显示一个yuv照片
ffmpeg
aaajj6 小时前
[Android]init中添加新的command
android
暗碳6 小时前
安卓/system/bin下命令中文说明(AI)
android
晚风_END6 小时前
python|利用ffmpeg按顺序合并指定目录内的ts文件
开发语言·python·青少年编程·ffmpeg·vim·objective-c
Hacker_Oldv7 小时前
网络安全-企业环境渗透2-wordpress任意文件读&&FFmpeg任意文件读
安全·web安全·ffmpeg
加勒比之杰克7 小时前
【数据库初阶】Linux中库的基础操作
android·linux·数据库·mysql·增删改查·cpp·crud
rickys20808 小时前
Ubuntu修改swap大小
linux·运维·ubuntu