MAC-AndroidStudio-NDK环境环境下FFmpeg的编译

MAC-AndroidStudio-NDK环境环境下FFmpeg的编译

环境:

mac OS 10.15.4
AndroidStudio 3.5.3
ffmpeg 3.3.6
ndk android-ndk-r15c
platform android-21

配置

操作步骤:
1.修改configure,去掉so文件输出时的版本信息
修改内容如下:

#修改前
#SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
#修改前
#SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
#修改前
#SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
SLIB_INSTALL_LINKS='\$(SLIBNAME)'

2.创建build_android.sh文件,并增加内容如下:

#!/bin/bash
# 修改为自己NDK包根目录
export NDK_HOME=「你下载的NDK解压目录」如:/Users/用户/android-ndk-r15c
#根据自己的需求修改编译平台版本
export PLATFORM_VERSION=android-21「根据你的需要修改」
#定义编译方法
function build
{
    #echo 输出命令
    echo "start build ffmpeg for $ARCH"
    #调用configure命令开始编译,并传入对应的参数
    ./configure --target-os=linux \
    --prefix=$PREFIX --arch=$ARCH \
    --disable-doc \
    --disable-static \
    --disable-yasm \
    --disable-asm \
    --disable-symver \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --cross-prefix=$CROSS_COMPILE \
    --enable-cross-compile \
    --enable-shared \
    --enable-gpl \
    --sysroot=$SYSROOT \
    --enable-small \
    --extra-cflags="-Os -fpic $ADDI_CFLAGS" \
    --extra-ldflags="$ADDI_LDFLAGS" \
    $ADDITIONAL_CONFIGURE_FLAG
    make clean
    make
    make install
    echo "build ffmpeg for $ARCH finished"
}

#编译 arm-v7a
PLATFORM_VERSION=android-21「根据你的需要修改」
ARCH=x86_64「根据你的需要修改,如下:其它配置方案」
CPU=x86_64 #CPU架构
PREFIX=$(pwd)/android_all/$CPU  #输出路径:当前目录/android_all/CPU架构/
TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- #交叉编译环境路径
ADDI_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -mfpu=neon"
ADDI_LDFLAGS="-march=armv7-a -Wl,--fix-cortex-a8"
SYSROOT=$NDK_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH/
build


其它配置方案:

#arm
PLATFORM_VERSION=android-14
ARCH=arm
CPU=armeabi

#arm-v7a
PLATFORM_VERSION=android-14
ARCH=arm
CPU=armeabi-v7a

#arm64
PLATFORM_VERSION=android-21
ARCH=arm64
CPU=arm64

#x86
PLATFORM_VERSION=android-14
ARCH=x86
CPU=x86

#x86_64
PLATFORM_VERSION=android-21
ARCH=x86_64
CPU=x86_64

#mips
PLATFORM_VERSION=android-14
ARCH=mips
CPU=mips


#mips64
PLATFORM_VERSION=android-21
ARCH=mips64
CPU=mips64

3.执行build_android.sh文件
这里有几个需要注意的地方
1.修改build_android.sh为可执行文件,方法如下:

chmod 777 build_android.sh 

2.解除mac对任何来源的应用程序运行的限制

sudo spctl --master-disable

使用此命令可以检查一下你的系统设置安全与隐私的
在这里插入图片描述
是否可以允许任何来源

3.运行build_android.sh脚本

sudo ./build_android.sh

编译过程大概需要五六分钟左右,编译完成后可以根据脚本中你指定的输出目录中查看编译好的so文件,脚本默认输出目录是:ffmpeg当前目录/android_all/CPU架构/ , 类似如下图所示:
在这里插入图片描述

备注:我在使用过程中遇到的其它问题

在mac系统下编译x86_64的so时候,提示
yasm/nasm not found or too old. Use --disable-yasm for a crippled build.

解决办法参考:https://blog.csdn.net/l1028386804/article/details/80976376

原文内容:
===------------------------
安装ffmpeg过程中,执行./configure时,报yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild错误,分析、解决如下:

分析:yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等。所以系统中未安装yasm时,就会报上面错误。

解决:安装yasm编译器。安装方法如下:

在http://www.tortall.net/projects/yasm/releases下面找到适合自己平台的yasm版本。然后进行安装。举例如下:

1)下载:wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz「可以手动下载到mac本地」

2)解压:tar zxvf yasm-1.3.0.tar.gz「可手动解压」

3)切换路径: cd yasm-1.3.0

4)执行配置: ./configure

5)编译:make

6)安装:make install
===------------------------

另一种build_android.sh配置方案
#!/bin/sh

MY_LIBS_NAME=ffmpeg-3.3.6
MY_DIR=ffmpeg-3.3.6

# cd ./${MY_DIR}

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


NDK_PATH=/Users/xxxx/Downloads/android-ndk-r15c
BUILD_PLATFORM=darwin-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21

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 "-------------------star 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级编译目录


	 ./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"





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值