下载代码
git clone git@github.com:FFmpeg/FFmpeg.git
git checkout n7.0
建立build目录
mkdir build
cd build
创建build.sh脚本
vim build.sh
这段脚本的主要功能是配置和编译 FFmpeg,使其能够在 Android 平台上运行,通过设置不同的架构和 API 级别,可以生成适用于不同 Android 设备的 FFmpeg 库。
#!/bin/bash
# 设置 NDK 路径(需替换为实际路径)
NDK=/home/hui/Android/Sdk/ndk/21.0.6113669/
# 选择目标架构(armv7a/arm64/x86/x86_64)
ARCH=arm64
API=21
# 工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
# 输出目录
PREFIX=$(pwd)/android/$ARCH
# 根据架构配置参数
case "$ARCH" in
armv7a)
CPU=armv7-a
TARGET_TRIPLE=armv7a-linux-androideabi
;;
arm64)
CPU=armv8-a
TARGET_TRIPLE=aarch64-linux-android
;;
x86)
CPU=i686
TARGET_TRIPLE=i686-linux-android
;;
x86_64)
CPU=x86_64
TARGET_TRIPLE=x86_64-linux-android
;;
esac
# 编译器路径
CC=$TOOLCHAIN/bin/$TARGET_TRIPLE$API-clang
CXX=$TOOLCHAIN/bin/$TARGET_TRIPLE$API-clang++
STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
# FFmpeg 配置参数
../configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--enable-gpl \
--enable-cross-compile \
--enable-jni \
--enable-ffmpeg \
--disable-doc \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--strip=$STRIP \
--sysroot=$TOOLCHAIN/sysroot \
--extra-cflags="-march=$CPU -O3 -fPIC" \
--extra-ldflags="-Wl,-rpath-link=$TOOLCHAIN/sysroot/usr/lib"
make clean
make -j16
make install
关键步骤说明
设置路径:包括 NDK 路径、工具链路径和输出目录。
配置参数:根据目标架构设置相应的编译参数。
调用 FFmpeg 配置脚本:传递所有必要的参数以配置 FFmpeg 编译环境。
编译和安装:清理之前的编译结果,进行编译并安装生成的库文件。
FFmpeg 配置脚本
../configure \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
--enable-gpl \
--enable-cross-compile \
--enable-jni \
--enable-ffmpeg \
--disable-doc \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--strip=$STRIP \
--sysroot=$TOOLCHAIN/sysroot \
--extra-cflags="-march=$CPU -O3 -fPIC" \
--extra-ldflags="-Wl,-rpath-link=$TOOLCHAIN/sysroot/usr/lib"
参数解释:
--prefix=$PREFIX
:指定安装目录。
--disable-shared
:禁用共享库生成。
--enable-static
:启用静态库生成。
--enable-gpl
:启用 GPL 许可证的功能。
--enable-cross-compile
:启用交叉编译。
--enable-jni
:启用 JNI 支持。
--enable-ffmpeg
:启用 FFmpeg 应用程序。
--disable-doc
:禁用文档生成。
--target-os=android:指定目标操作系统为 Android。
--arch=$ARCH
:指定目标架构。
--cpu=$CPU
:指定目标 CPU 架构。
--cc=$CC
和 --cxx=$CXX
:指定 C 和 C++ 编译器路径。
--strip=$STRIP
:指定用于剥离调试符号的工具路径。
--sysroot=$TOOLCHAIN/sysroot
:指定系统根目录。
--extra-cflags="-march=$CPU -O3 -fPIC"
:指定额外的编译标志。
--extra-ldflags="-Wl,-rpath-link=$TOOLCHAIN/sysroot/usr/lib"
:指定额外的链接标志。
--disable-shared
& --enable-static
好处是把ffmpeg编译成一个独立的可执行文件,放到手机里面的时候只需要把ffmpeg程序push进去即可。
在手机上运行
adb push ffmpeg /data/local
adb shell
$ chmod +x /data/local/ffmpeg
$ /data/local/ffmpeg -i /sdcard/
执行ffmpeg命令:
phone:/sdcard $ /data/local/ffmpeg -i input.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2025-03-03T07:01:49.000000Z
com.android.version: 14
Duration: 00:02:31.20, start: 0.000000, bitrate: 21470 kb/s
Stream #0:0[0x1](eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 2160x3840, 21371 kb/s, 60 fps, 60 tbr, 90k tbn (default)
Metadata:
creation_time : 2025-03-03T07:01:49.000000Z
handler_name : VideoHandle
vendor_id : [0][0][0][0]
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
Metadata:
creation_time : 2025-03-03T07:01:49.000000Z
handler_name : SoundHandle
vendor_id : [0][0][0][0]