【使用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

相关推荐
知行合一。。。2 小时前
Python--03--函数入门
android·数据库·python
warton882 小时前
ubuntu24 安装 proxsql 实现数据库代理
linux·运维·mysql·ubuntu
会跑的葫芦怪2 小时前
cursor 打开wsl Ubuntu项目
linux·运维·ubuntu
大、男人3 小时前
python之contextmanager
android·python·adb
ChenYY~3 小时前
双系统显卡冲突修复记录
ubuntu·显卡·黑屏·双系统·nvidia驱动
oMcLin3 小时前
如何在 Ubuntu 22.04 LTS 上部署并优化 OpenStack 云计算平台,实现多租户虚拟化与弹性伸缩?
ubuntu·云计算·openstack
majingming1234 小时前
ubuntu下的交叉编译
linux·运维·ubuntu
shchojj4 小时前
ubuntu 因为写错pam.d文件引起的sudo权限丢失
linux·运维·ubuntu
不法5 小时前
java查看安卓证书信息
android
儿歌八万首5 小时前
Jetpack Compose 动画实战:让你的 UI 动起来
android·kotlin·动画·compose