交叉编译Android
输出目录配置
FFMPEG 编译后需要生成一系列的函数库,及头文件等,需要为这些生成的文件指定输出目录
# 将输出目录存储到 PREFIX 变量中
PREFIX=./android/armeabi-v7a
# 执行 configure 脚本配置输出文件的根目录
./configure --prefix=$PREFIX
函数库配置
FFMPEG 编译时可以选择编译静态库或动态库 , 及设置编译函数库的行为;
FFMPEG 默认编译静态库;
由于是在 Android 中进行开发 , 为了使打包后的 APK 文件尽可能小 , 调用./configure --enable-small命令 , 启用优化函数库大小的功能 ;
./configure \
# 启用函数库大小优化
--enable-small \
# 不编译静态库
--disable-static \
# 编译动态库
--enable-shared
命令行程序配置
FFMPEG 提供了一些可执行的命令行程序,如 ffmpeg.exe , ffplay.exe , ffprobe.exe 等程序; 在 Android 开发中只需要 FFMPEG 的函数库,不需要这些程序,建议关闭命令行程序编译选项;
# 关闭编译命令行程序
./configure --disable-programs
也可以单独关闭
# 关闭编译命令行程序
./configure
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
编译组件配置
FFMPEG 有 22 个可选的独立组件配置,可以选择性编译或不编译某些组件,默认都是打开的,如果需要 关闭某一个需要单独配置;
avdevice 组件:操作摄像头等视频设备, Android 中是不支持该操作,需要手动关闭;
avcodec 组件:声音 / 图像编解码组件;
avformat 组件 : 音视频封装格式生成或解析 ;
swresample 组件 : 音频重采样 , 修改音频参数 ;
swscale 组件 : 视频场景比例缩放 , 色彩映射转换 ;
postproc 组件 : 后期效果处理 , 这里不需要 , 需要手动关闭 ;
avfilter 组件 : 过滤器 , 添加字幕水印 ;
./configure
# 操作摄像头等视频设备, Android 中是不支持该操作, 需要手动关闭
--disable-avdevice
# 后期效果处理 , 这里不需要 , 需要手动关闭;
--disable-postproc
编码解码配置
编译armv7-a架构
#!/bin/bash
set -x # 执行指令后,先显示该指令及所下的参数。
# 目标Android版本
API=21
# arm aarch64 i686 x86_64
# # 配置编译平台 编译armv7-a架构
ARCH=arm
# armv7a aarch64 i686 x86_64
CPU=armv7-a
#so库输出目录
OUTPUT=/home/xy/android/so/$CPU
# NDK的路径,根据自己的NDK位置进行设置
NDK=/home/xy/android/ndk/ndk-r21e/android-ndk-r21e
# 编译工具链路径 交叉编译工具链目录变量
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
CROSS_PREFIX_CLANG=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-
# 编译环境
SYSROOT=$TOOLCHAIN/sysroot
function build
{
./configure \
--prefix=$OUTPUT \
# 配置编译后的应用平台
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-asm \
--enable-neon \
--enable-small \
# 开启交叉编译选项
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-symver \
--disable-programs \
--sysroot=$SYSROOT \
--cross-prefix=$CROSS_PREFIX \
--cross-prefix-clang=$CROSS_PREFIX_CLANG \
# 配置编译器参数
--extra-cflags="-fPIC"
make clean
# 这里是定义用几个CPU编译
make -j8
make install
}
build
编译armv8架构
#!/bin/bash
set -x # 执行指令后,先显示该指令及所下的参数。
# 目标Android版本
API=21
# 编译armv8架构
ARCH=aarch64
CPU=armv8
#so库输出目录
OUTPUT=/home/xy/android/so/$CPU
# NDK的路径,根据自己的NDK位置进行设置
NDK=/home/xy/android/ndk/ndk-r21e/android-ndk-r21e
# 编译工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-androideabi-
CROSS_PREFIX_CLANG=$TOOLCHAIN/bin/aarch64-linux-androideabi$API-
# 编译环境
SYSROOT=$TOOLCHAIN/sysroot
function build
{
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-asm \
--enable-neon \
--enable-small \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-symver \
--disable-programs \
--disable-avdevice \
--cross-prefix=$CROSS_PREFIX \
--cross-prefix-clang=$CROSS_PREFIX_CLANG \
--extra-cflags="-fPIC" \
--sysroot=$SYSROOT
make clean all
# 这里是定义用几个CPU编译
make -j8
make install
}
build
编译x86架构
#!/bin/bash
set -x # 执行指令后,先显示该指令及所下的参数。
# 目标Android版本
API=21
# 编译x86架构
ARCH=x86
CPU=x86
#so库输出目录
OUTPUT=/home/xy/android/so/$CPU
# NDK的路径,根据自己的NDK位置进行设置
NDK=/home/xy/android/ndk/ndk-r21e/android-ndk-r21e
# 编译工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
CROSS_PREFIX_CLANG=$TOOLCHAIN/bin/i686-linux-android$API-
# 编译环境
SYSROOT=$TOOLCHAIN/sysroot
function build
{
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--disable-asm \
--enable-neon \
--enable-small \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-symver \
--disable-programs \
--sysroot=$SYSROOT \
--cross-prefix=$CROSS_PREFIX \
--cross-prefix-clang=$CROSS_PREFIX_CLANG \
--extra-cflags="-fPIC -mno-stackrealign"
make clean
# 这里是定义用几个CPU编译
make -j8
make install
}
build
编译x86_64架构
#!/bin/bash
set -x # 执行指令后,先显示该指令及所下的参数。
# 目标Android版本
API=21
# 编译x86_64架构
ARCH=x86_64
CPU=x86_64
#so库输出目录
OUTPUT=/home/xy/android/so/$CPU
# NDK的路径,根据自己的NDK位置进行设置
NDK=/home/xy/android/ndk/ndk-r21e/android-ndk-r21e
# 编译工具链路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
CROSS_PREFIX_CLANG=$TOOLCHAIN/bin/x86_64-linux-android$API-
# 编译环境
SYSROOT=$TOOLCHAIN/sysroot
function build
{
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--disable-asm \
--enable-neon \
--enable-small \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-symver \
--disable-programs \
--sysroot=$SYSROOT \
--cross-prefix=$CROSS_PREFIX \
--cross-prefix-clang=$CROSS_PREFIX_CLANG \
--extra-cflags="-fPIC -mno-stackrealign"
make clean
# 这里是定义用几个CPU编译
make -j8
make install
}
build