arm-linux-androideabi-4.4.3 下载,编译Android平台使用的FFmpeg(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64)...

1. 编译平台 Ubuntu

9ee83933009a?from=singlemessage

Ubuntu 16.04

2. NDK

这里编译使用的是

[Android NDK, Revision 15c]

3. 编译过程

3.1 下载FFmpeg源码

最新版本: [FFmpeg 4.0]

下载后解压,打开终端,定位到下载目录

tar -xvf ffmpeg-4.0.tar.xz

3.2 修改configure脚本

为了在Android上使用,我们修改生成so库的脚本,生成以lib为前缀,.so为后置的name,在源文件目录下找到configure脚本,差不多在3566行

# SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'

# LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

# SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'

# SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

#修改为以下内容

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'

LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'

SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'

SLIB_INSTALL_LINKS='$(SLIBNAME)'

3.3 编写编译脚本

创建脚本文件 build.sh,编辑内容,脚本文件位于FFmpeg源文件目录下

#!/bin/sh

MY_LIBS_NAME=ffmpeg-4.0

MY_DIR=ffmpeg-4.0

# cd ./${MY_DIR}

#编译的过程中产生的中间件的存放目录,为了区分编译目录,源码目录,install目录

MY_BUILD_DIR=binary

NDK_PATH=/home/as/Android/android-ndk-r15c

BUILD_PLATFORM=linux-x86_64

TOOLCHAIN_VERSION=4.9

ANDROID_VERSION=24

ANDROID_ARMV5_CFLAGS="-march=armv5te"

ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp

ANDROID_ARMV8_CFLAGS="-march=armv8-a"

ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"

ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"

# params($1:arch,$2:arch_abi,$3:host,$4:cross_prefix,$5:cflags)

build_bin() {

echo "-------------------start build $2-------------------------"

ARCH=$1 # arm arm64 x86 x86_64

ANDROID_ARCH_ABI=$2 # armeabi armeabi-v7a x86 mips

PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/

HOST=$3

SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH}

CFALGS=$5

TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}

CROSS_PREFIX=${TOOLCHAIN}/bin/$4-

# build 中间件

BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}

echo "pwd==$(pwd)"

echo "ARCH==${ARCH}"

echo "PREFIX==${PREFIX}"

echo "HOST==${HOST}"

echo "SYSROOT=${SYSROOT}"

echo "CFALGS=$5"

echo "CFALGS=${CFALGS}"

echo "TOOLCHAIN==${TOOLCHAIN}"

echo "CROSS_PREFIX=${CROSS_PREFIX}"

#echo "-------------------------按任意键继续---------------------"

#read -n 1

#echo "-------------------------继续执行-------------------------"

mkdir -p ${BUILD_DIR} #创建当前arch_abi的编译目录,比如:binary/armeabi-v7a

cd ${BUILD_DIR} #此处 进了当前arch_abi的2级编译目录

sh ../../${MY_DIR}/configure \

--prefix=${PREFIX} \

--target-os=linux \

--arch=${ARCH} \

--sysroot=$SYSROOT \

--enable-cross-compile \

--cross-prefix=${CROSS_PREFIX} \

--extra-cflags="$CFALGS -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \

--extra-cxxflags="-D__thumb__ -fexceptions -frtti" \

--extra-ldflags="-L${SYSROOT}/usr/lib" \

--enable-shared \

--enable-asm \

--enable-neon \

--disable-encoders \

--enable-encoder=aac \

--enable-encoder=mjpeg \

--enable-encoder=png \

--disable-decoders \

--enable-decoder=aac \

--enable-decoder=aac_latm \

--enable-decoder=h264 \

--enable-decoder=mpeg4 \

--enable-decoder=mjpeg \

--enable-decoder=png \

--disable-demuxers \

--enable-demuxer=image2 \

--enable-demuxer=h264 \

--enable-demuxer=aac \

--disable-parsers \

--enable-parser=aac \

--enable-parser=ac3 \

--enable-parser=h264 \

--enable-gpl \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-symver \

--disable-debug \

--enable-small

make clean

make

make install

#从当前arch_abi编译目录跳出,对应上面的cd ${BUILD_DIR},以便function多次执行

cd ../../

echo "-------------------$2 build end-------------------------"

}

# build armeabi

build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a

build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a

build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"

#build x86

build_bin x86 x86 x86 i686-linux-android "$ANDROID_X86_CFLAGS"

#build x86_64

build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS"

脚本编写注意事项

不要在有换行连接符\的语句中插入注释#,有可能会使后面的内容连接失败,尤其 ./configure语句后面的option选项中

FFmpeg 4.0 源码编译中会出现以下两个文件的编译错误

libavcodec / aaccoder.c:函数'search_for_ms':

libavcodec / aaccoder.c:803:25:错误:预期的标识符或'('数字常量之前

libavcodec / hevc_mvs.c:函数'derive_spatial_merge_candidates'

libavcodec / hevc_mvs.c:368:23:错误:'y0000000'未声明(首次在此函数中使用

是因为在include的/usr/arm-linux-androideabi/include/asm/termbits.h文件中定义了B0 0000000的宏,导致aaccooder.c hevc_mvs.c文件中的B0变量被宏替换

#define B0 0000000

解决方法就是,在这两个文件中,把所有的B0,替换成其它字符,比如我替换为:bb, 注意不要和其它变量重复定义

--extra-cflags里不要加不被支持的选项,否则会出现C compiler test failed的错误,具体哪些不被识别,请报错之后查看config.log文件,比如在编译arm64-v8a时

aarch64-linux-android-gcc: error: unrecognized command line option '-mfloat-abi=softfp'

每一个arch编译过程中出现以下 WARNING可以忽略

WARNING: /home/as/Android/android-ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-pkg-config not found, library detection may fail.

3.4 编译

在build.sh编译脚本所在的目录打开终端

执行 sudo sh build.sh,开始编译,脚本文件里指定了--prefix,install目录由--prefix指定在源码目录文件夹下的dist,安装脚本会在dist下生成安装对应CPU架构的的库

9ee83933009a?from=singlemessage

sh编译过程

9ee83933009a?from=singlemessage

pwd

9ee83933009a?from=singlemessage

dist

9ee83933009a?from=singlemessage

arm64-v8a

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值