centos7使用ndk编译FFmpeg

7 篇文章 0 订阅
6 篇文章 0 订阅

centos7使用ndk编译FFmpeg

1. 软件版本

  1. ndk版本:android-ndk-r20b
    下载地址:https://developer.android.google.cn/ndk/downloads/older_releases#ndk-20b-downloads
  2. FFmpeg版本:ffmpeg-4.4.3
    下载地址:http://ffmpeg.org/download.html?aemtn=tg-on
  3. lame使用ndk编译参考:centos7使用ndk编译lame
  4. x264使用ndk编译参考:centos7使用ndk编译x264
  5. fdk-aac使用ndk编译参考:centos使用ndk编译fdk-acc-2.0.2

2. 编译脚本

脚本位置:ffmpeg-4.4.3/build_android.sh

#!/bin/bash
function build_android
{
./configure \
--enable-shared \
--enable-static \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-devices \
--disable-postproc \
--disable-indevs \
--disable-outdevs \
--disable-asm \
--disable-yasm \
--disable-x86asm \
--disable-doc \
--disable-debug \
--enable-small \
--enable-gpl \
--enable-neon \
--enable-nonfree \
--disable-bsfs \
--enable-bsf=aac_adtstoasc \
--enable-bsf=h264_mp4toannexb \
--enable-libfdk_aac \
--enable-libx264 \
--enable-libmp3lame \
--enable-cross-compile \
--enable-jni \
--enable-pic \
--enable-pthreads \
--enable-cross-compile \
--target-os=android \
--prefix=$PREFIX \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--extra-cflags="-I${LAME_INCLUDE} -I${X264_INCLUDE} -I${FDK_INCLUDE} -Os -fpic ${OPTIMIZE_CFLAGS}" \
--extra-ldflags="-lm -L${LAME_LIB} -L${FDK_LIB} -L${X264_LIB} ${ADDI_LDFLAGS}" 

make clean
make -j8
make install
}

# NDK所在目录
NDK_ROOT=/root/workspace/android-ndk-r20b
TOOLCHAIN="${NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64"
SYSROOT=$TOOLCHAIN/sysroot

# 最低支持的Android版本
V=21

# 其他库所在目录公共前缀
BASE_PATH=/root/workspace

#32位V7 # armeabi-v7a armv7a-linux-androideabi
PREFIX=$(pwd)/android/armeabi-v7a
ARCH=arm
CPU=armv7-a
HOST=armv7a-linux-androideabi
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
CC=$TOOLCHAIN/bin/$HOST$V-clang
CXX=$TOOLCHAIN/bin/$HOST$V-clang++
LIB_TARGET_ABI=armeabi-v7a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=${CPU} "
ADDI_LDFLAGS="-marm -march=${CPU}"

# 指定fdk-aac的头文件和静态库目录
FDK_INCLUDE=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/include
FDK_LIB=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/lib

# 指定x264的头文件和静态库目录
X264_INCLUDE=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/include
X264_LIB=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/lib

# 指定lame的头文件和库目录
LAME_INCLUDE=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/include
LAME_LIB=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/lib

build_android

#64位V8 # arm64-v8a   aarch64-linux-android
# PREFIX=$(pwd)/android/arm64-v8a
# ARCH=aarch64
# CPU=armv8-a
# HOST=aarch64-linux-android
# CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
# CC=$TOOLCHAIN/bin/$HOST$V-clang
# CXX=$TOOLCHAIN/bin/$HOST$V-clang++
# LIB_TARGET_ABI=arm64-v8a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=${CPU} "
# ADDI_LDFLAGS="-marm -march=${CPU}"

# 指定fdk-aac的头文件和静态库目录
# FDK_INCLUDE=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/include
# FDK_LIB=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/lib

# 指定x264的头文件和静态库目录
# X264_INCLUDE=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/include
# X264_LIB=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/lib

# 指定lame的头文件和库目录
# LAME_INCLUDE=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/include
# LAME_LIB=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/lib

# build_android

#32位x86 # x86 i686-linux-android
# PREFIX=$(pwd)/android/x86
# ARCH=x86
# CPU=x86
# HOST=i686-linux-android
# CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
# CC=$TOOLCHAIN/bin/$HOST$V-clang
# CXX=$TOOLCHAIN/bin/$HOST$V-clang++
# LIB_TARGET_ABI=x86
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 "
# ADDI_LDFLAGS="-marm -march=${CPU}"

# 指定fdk-aac的头文件和静态库目录
# FDK_INCLUDE=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/include
# FDK_LIB=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/lib

# 指定x264的头文件和静态库目录
# X264_INCLUDE=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/include
# X264_LIB=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/lib

# 指定lame的头文件和库目录
# LAME_INCLUDE=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/include
# LAME_LIB=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/lib

# build_android

#64位x86_64 # x86-64  x86_64-linux-android
# PREFIX=$(pwd)/android/x86_64
# ARCH=x86_64
# CPU=x86-64 # 注意此处中间为-,不是_
# HOST=x86_64-linux-android
# CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
# CC=$TOOLCHAIN/bin/$HOST$V-clang
# CXX=$TOOLCHAIN/bin/$HOST$V-clang++
# LIB_TARGET_ABI=x86_64
# OPTIMIZE_CFLAGS="-msse4.2 -mpopcnt -m64 -mtune=intel -march=${CPU} "
# ADDI_LDFLAGS="-marm -march=${CPU}"

# 指定fdk-aac的头文件和静态库目录
# FDK_INCLUDE=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/include
# FDK_LIB=$BASE_PATH/fdk-aac-2.0.2/android/$LIB_TARGET_ABI/lib

# 指定x264的头文件和静态库目录
# X264_INCLUDE=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/include
# X264_LIB=$BASE_PATH/x264-master/android/$LIB_TARGET_ABI/lib

# 指定lame的头文件和库目录
# LAME_INCLUDE=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/include
# LAME_LIB=$BASE_PATH/lame-3.100/android/$LIB_TARGET_ABI/lib

# build_android

单独编译FFmpeg,不使用lamefdk-aacx264的脚本:

#!/bin/bash
function build_android
{
./configure \
--enable-shared \
--enable-static \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-devices \
--disable-postproc \
--disable-indevs \
--disable-outdevs \
--disable-asm \
--disable-yasm \
--disable-x86asm \
--disable-doc \
--disable-debug \
--enable-small \
--enable-gpl \
--enable-neon \
--enable-nonfree \
--disable-bsfs \
--enable-bsf=aac_adtstoasc \
--enable-bsf=h264_mp4toannexb \
--enable-cross-compile \
--enable-jni \
--enable-pic \
--enable-pthreads \
--enable-cross-compile \
--target-os=android \
--prefix=$PREFIX \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic ${OPTIMIZE_CFLAGS}" \
--extra-ldflags="-lm ${ADDI_LDFLAGS}" 

make clean
make -j8
make install
}

# NDK所在目录
NDK_ROOT=/root/workspace/android-ndk-r20b
TOOLCHAIN="${NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64"
SYSROOT=$TOOLCHAIN/sysroot

# 最低支持的Android版本
V=21

#32位V7 # armeabi-v7a armv7a-linux-androideabi
# PREFIX=$(pwd)/android_2/armeabi-v7a
# ARCH=arm
# CPU=armv7-a
# HOST=armv7a-linux-androideabi
# CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
# CC=$TOOLCHAIN/bin/$HOST$V-clang
# CXX=$TOOLCHAIN/bin/$HOST$V-clang++
# LIB_TARGET_ABI=armeabi-v7a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=${CPU} "
# ADDI_LDFLAGS="-marm -march=${CPU}"

# build_android

#64位V8 # arm64-v8a   aarch64-linux-android
PREFIX=$(pwd)/android_2/arm64-v8a
ARCH=aarch64
CPU=armv8-a
HOST=aarch64-linux-android
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
CC=$TOOLCHAIN/bin/$HOST$V-clang
CXX=$TOOLCHAIN/bin/$HOST$V-clang++
LIB_TARGET_ABI=arm64-v8a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=${CPU} "
ADDI_LDFLAGS="-marm -march=${CPU}"

build_android

#32位x86 # x86 i686-linux-android
# PREFIX=$(pwd)/android_2/x86
# ARCH=x86
# CPU=x86
# HOST=i686-linux-android
# CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
# CC=$TOOLCHAIN/bin/$HOST$V-clang
# CXX=$TOOLCHAIN/bin/$HOST$V-clang++
# LIB_TARGET_ABI=x86
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32 "
# ADDI_LDFLAGS="-marm -march=${CPU}"

# build_android

#64位x86_64 # x86-64  x86_64-linux-android
# PREFIX=$(pwd)/android_2/x86_64
# ARCH=x86_64
# CPU=x86-64 # 注意此处中间为-,不是_
# HOST=x86_64-linux-android
# CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
# CC=$TOOLCHAIN/bin/$HOST$V-clang
# CXX=$TOOLCHAIN/bin/$HOST$V-clang++
# LIB_TARGET_ABI=x86_64
# OPTIMIZE_CFLAGS="-msse4.2 -mpopcnt -m64 -mtune=intel -march=${CPU} "
# ADDI_LDFLAGS="-marm -march=${CPU}"

# build_android

执行脚本:

# 1. 添加权限
chmod a+x build_android.sh
# 2. 执行脚本
./build_android.sh

3. 编译结果

结果

4. 遇到的问题

1.编译x86-64时遇到 C compiler test failed
问题

原因:

# 查看编译日志
vim ffbuild/config.log

原因
2. 编译x86时遇到如下问题:
问题
解决方法:
编译配置添加如下内容,取消汇编优化

--disable-asm \
--disable-yasm \

5. 参考

  1. Unbuntu环境编译 Android平台可用ffmpeg(带三方库fdk-aac和lame)
  2. 利用NDK(r20) 编译FFmpeg 4.2.1 Android版本
  3. nkd 编译ffmpeg错误: clang is unable to create an executable file. C compiler test failed.
  4. Clang编译Android平台能用的FFmpeg可执行程序
  5. ffmpeg4.4在Linux下使用android NDK 21新版本编译及其问题解决
  6. FFmpeg、x264以及fdk-aac 编译整合

6. 项目地址

https://toscode.gitee.com/icebear221/AndroidFFmpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值