Android --ffmpeg(二)交叉编译动态库

637 阅读2分钟

交叉编译Android

参考:blog.csdn.net/shulianghan…

输出目录配置

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