Ubuntu下 Android NDK 编译 FFmpeg + x264 + fdk-aac (arm/x86)的配置脚本

简介: Ubuntu下 Android NDK 编译 FFmpeg + x264 + fdk-aac (arm/x86)的配置脚本

系统是Ubuntu 16.04 LTS,x264 和 fdk-aac 都是当前的最新版,FFmpeg是2.8.8,使用的NDK 版本是r10e




主要参考自


http://blog.chinaunix.net/uid-26000296-id-5213411.html

http://www.itnose.net/detail/6219672.html

http://zhangcb666.blog.163.com/blog/static/46963529201392362743670/



我的目录结构是

image.png

生成的库文件和头文件最终会根据prefix的指定,在make install之后被放置到各个android目录下

image.png

image.pngimage.png

arm的 x264 的config.sh

export NDK=/home/pan/Downloads/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-asm \
--enable-strip \
--host=arm-linux-androideabi \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS=""
build_one

arm的 fdk-aac 的config.sh

#!/bin/sh
export NDK_HOME=/home/pan/Downloads/android-ndk-r10e
ANDROID_API=android-14
SYSROOT=$NDK_HOME/platforms/$ANDROID_API/arch-arm
ANDROID_BIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/
CROSS_COMPILE=${ANDROID_BIN}/arm-linux-androideabi-
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
ARM_INC=$SYSROOT/usr/include
ARM_LIB=$SYSROOT/usr/lib
LDFLAGS=" -nostdlib -Bdynamic -Wl,--whole-archive -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$NDK_HOME/sources/cxx-stl/gnu-libstdc++/libs/armeabi -L$NDK_HOME/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/arm-linux-androideabi/lib -L$ARM_LIB  -lc -lgcc -lm -ldl  "
FLAGS="--host=arm-linux-androideabi --enable-static --disable-shared"
export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"
CPU=arm
./configure $FLAGS \
--prefix=$(pwd)/android/$CPU

arm的FFmpeg 的config.sh

export NDK=/home/pan/Downloads/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-14/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export TMPDIR=/home/pan/Downloads/tmp
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffserver \
--disable-asm \
--enable-gpl \
--enable-libx264 \
--enable-libfdk-aac \
--enable-cross-compile \
--enable-nonfree \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm -I/home/pan/Downloads/x264/android/arm/include -I/home/pan/Downloads/fdk-aac/android/arm/include -DANDROID "
ADDI_LDFLAGS="-L/home/pan/Downloads/x264/android/arm/lib -L/home/pan/Downloads/fdk-aac/android/arm/lib"
build_one

以上路径需要根据自己的目录结构进行修改,尤其是FFmpeg的config.sh,ADDI_CFLAGS 和 ADDI_LDFLAGS 分别指定了 x264 和 fdk-aac 的头文件和库文件的路径。




注意:


1.如果需要去掉生成库的版本号,可以参考这篇文章——http://www.itnose.net/detail/6219672.html

2.如果要生成非arm架构的库,也需要做对应修改;




x86的 x264 的config.sh:

export NDK=/home/pan/Downloads/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-x86/
export TOOLCHAIN=$NDK/toolchains/x86-4.8/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-static \
--enable-shared \
--enable-pic \
--disable-asm \
--enable-strip \
--host=i686-linux-android \
--cross-prefix=$TOOLCHAIN/bin/i686-linux-android- \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=x86
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS=""
build_one

x86的 fdk-aac 的config.sh

#!/bin/sh
export NDK_HOME=/home/pan/Downloads/android-ndk-r10e
ANDROID_API=android-14
SYSROOT=$NDK_HOME/platforms/$ANDROID_API/arch-x86
ANDROID_BIN=$NDK_HOME/toolchains/x86-4.8/prebuilt/linux-x86_64/bin/
CROSS_COMPILE=${ANDROID_BIN}/i686-linux-android-
export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
ARM_INC=$SYSROOT/usr/include
ARM_LIB=$SYSROOT/usr/lib
LDFLAGS=" -nostdlib -Bdynamic -Wl,--whole-archive -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$NDK_HOME/sources/cxx-stl/gnu-libstdc++/libs/x86 -L$NDK_HOME/toolchains/x86-4.8/prebuilt/linux-x86_64/i686-linux-android/lib -L$ARM_LIB  -lc -lgcc -lm -ldl  "
FLAGS="--host=i686-linux-android --enable-static --disable-shared"
export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"
CPU=x86
./configure $FLAGS \
--prefix=$(pwd)/android/$CPU

x86的 ffmpeg 的 config.sh

export NDK=/home/pan/Downloads/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-14/arch-x86/
export TOOLCHAIN=$NDK/toolchains/x86-4.8/prebuilt/linux-x86_64
export TMPDIR=/home/pan/Downloads/tmp
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffserver \
--disable-asm \
--enable-gpl \
--enable-libx264 \
--enable-libfdk-aac \
--enable-cross-compile \
--enable-nonfree \
--cross-prefix=$TOOLCHAIN/bin/i686-linux-android- \
--target-os=linux \
--arch=x86 \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=x86
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-I/home/pan/Downloads/x264/android/x86/include -I/home/pan/Downloads/fdk-aac/android/x86/include -DANDROID "
ADDI_LDFLAGS="-L/home/pan/Downloads/x264/android/x86/lib -L/home/pan/Downloads/fdk-aac/android/x86/lib"
build_one

3.目前这种方法生成的是多个带版本号的so,也可以通过写一个Bash将它们(静态库)打包为一个ffmpeg.so方便调用。


如图:

image.pngimage.png

目录
相关文章
|
9月前
|
存储 机器学习/深度学习 数据库
阿里云服务器X86/ARM/GPU/裸金属/超算五大架构技术特点、场景适配参考
在云计算技术飞速发展的当下,云计算已经渗透到各个行业,成为企业数字化转型的关键驱动力。选择合适的云服务器架构对于提升业务效率、降低成本至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供大家了解和选择参考。
1298 61
|
6月前
|
机器学习/深度学习 Android开发 数据安全/隐私保护
手机脚本录制器, 脚本录制器安卓,识图识色屏幕点击器【autojs】
完整的UI界面,包含录制控制按钮和状态显示 屏幕点击动作录制功能,记录点击坐标和时间间隔
|
7月前
|
Android开发 数据安全/隐私保护 Python
微信抢红包脚本安卓插件,微信xposed抢红包模块, magisk微信抢红包模块
这个代码实现了一个完整的微信抢红包自动化工具,包含红包检测、自动点击、日志记录等功能
|
7月前
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
10月前
|
存储 机器学习/深度学习 算法
阿里云X86/ARM/GPU/裸金属/超算等五大服务器架构技术特点、场景适配与选型策略
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别。本文将深入解析这些架构的特点、优势及适用场景,帮助用户更好地根据实际需求做出选择。
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器ECS架构区别及选择参考:X86计算、ARM计算等架构介绍
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下这些架构各自的主要性能及适用场景,以便大家了解不同类型的架构有何不同,主要特点及适用场景有哪些。
1788 10
|
Ubuntu 芯片 开发者
Ubuntu 25 ARM 桌面系统抢先版发布:第一个Ubuntu ARM桌面系统
Ubuntu 25.04 将于2025年发布,首次支持ARM Desktop桌面版系统,为ARM架构设备如Mac M系列芯片、Raspberry Pi等带来全新的桌面体验。用户可通过虚拟机或双系统安装在Mac上运行Ubuntu ARM,抢先体验版已开放下载:[链接](https://www.baihezi.com/ubuntu/arm/desktop)。此版本不仅扩展了Ubuntu的硬件兼容性,还提供了丰富的功能和流畅的操作体验,适合开发者和技术爱好者尝试。
4817 9
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器架构有啥区别?X86计算、Arm、GPU异构、裸金属和高性能计算对比
阿里云ECS涵盖x86、ARM、GPU/FPGA/ASIC、弹性裸金属及高性能计算等多种架构。x86架构采用Intel/AMD处理器,适用于广泛企业级应用;ARM架构低功耗,适合容器与微服务;GPU/FPGA/ASIC专为AI、图形处理设计;弹性裸金属提供物理机性能;高性能计算则针对大规模并行计算优化。
1009 7
|
Docker 容器
docker:记录如何在x86架构上构造和使用arm架构的镜像
为了实现国产化适配,需将原x86平台上的Docker镜像转换为适用于ARM平台的镜像。本文介绍了如何配置Docker buildx环境,包括检查Docker版本、安装buildx插件、启用实验性功能及构建多平台镜像的具体步骤。通过这些操作,可以在x86平台上成功构建并运行ARM64镜像,实现跨平台的应用部署。
10215 2
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
589 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库