Android音视频系列

mac下编译Android ffmpeg 4.0版本

2019-06-20  本文已影响51人  在雨天中守望晴天

编译环境:

macOS:10.13.6
NDK:android-ndk-r14b
ffmpeg:4.0版本

一、下载或者clone ffmpeg工程

ffmpeg的官网:
http://ffmpeg.org/download.html#repositories

ffmpeg官网.png

在指定的目录下clone ffmpeg代码
git clone https://git.ffmpeg.org/ffmpeg.git

这个时候下载下来的ffmpeg是最新版本的,git branch -a 可以查看已经有的版本,git checkout -b ffmpeg_4.0 remotes/origin/origin/release/4.0,切换到4.0分支,也就是4.0的稳定版本。

二、NDK下载并配置

可以直接去官网下载
https://developer.android.google.cn/ndk/downloads/

这里选择了android-14b版本进行下载


ndk下载.png

下载完成后配置ndk环境:
在终端输入:vi ~/.bash_profile
输入配置ndk:

export ANDROID_NDK_ROOT=/自己的路径/android-ndk-r14d/build
export PATH=${PATH}:${ANDROID_NDK_ROOT}

:wq完成保存输入后:source ~/.bash_profile 完成配置的保存

修改ndk配置.png

三、编译ffmpeg

1.修改configure文件
由于原先编译出来的动态库文件名的版本号在.so之后,如libavcodec.so.5.100.1,Android平台不能识别这种文件,所以需要修改文件名。
在下载或者clone的文件夹下,找到configure文件

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)'

2.编写脚本文件
在ffmpeg中创建一个build_android.sh的脚本

#!/bin/bash
ADDI_CFLAGS="-marm"
API=22
PLATFORM=arm-linux-androideabi
CPU=armv7-a
#使用自己的路径
export TMPDIR=/Users/hfy/Documents/ffmpeg/ffmpegout
NDK=/Users/hfy/Documents/Studio/android-ndk-r14b
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64
#手动创建输出目录
OUTPUT=/Users/hfy/Documents/ffmpeg/out
function build_one
{
./configure \
--prefix=$OUTPUT \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
--extra-ldflags="-marm" \
$ADDITIONAL_CONFIGURE_FLAG
 sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
make clean
# 这里是定义用几个CPU编译,我用4个,一般在5分钟之内编译完成
make -j4
make install
}

build_one

完成之后,赋予build_android.sh可执行权限
chmod a+x build_android.sh 或者 chmod 777 build_android.sh

3、执行
在ffmpeg目录下,先./configure,先生成*mak文件
完成后执行./build_android.sh

等待几分钟后,可以在输出目录中看到生成的so文件:


生成so.png

如果需要生成其他平台的so文件,修改build_android.sh输出的平台即可。

错误处理参考:

https://www.jianshu.com/p/03a9c4edc574
https://github.com/Bilibili/ijkplayer/issues/1335

上一篇下一篇

猜你喜欢

热点阅读