一、FFMPEG是什么?
1.FFMPEG可以做到对视频文件编码、解码、转码。
2.可以对多路音频复用、解复用。
3.可以对音视频流处理。
4.音视频的过滤器、播放。
5.支持从远古时期到现在的几乎所有格式。
6.Linux、Windows、Mac OS全平台支持。
7.高可移植性。
大家知道Android系统又是基于linux的,所以,FFMPEG在Android下也是可用的。因此我们在Android平台上对音视频处理,基本就绕不开FFMPEG。
但FFMPEG在Android上并不能直接用,而是需要把源码下载下来自己编译,当然网上也有别人编译好的,不过最好还是自己编译一下。这个时候我们就需要NDK了。NDK就是Native Development kit。本地开发工具包。
我们需要下载FFMEPG和NDK到本地了。这个时候需要注意了,在版本选择上一定注意,我刚开始在网上看到别人说不要下载最新版,最新版引进后有各种各样的问,我不以为然,顺手就下载了最新版本的FFMEPG和NDK,结果各种报错,解决了好几天,吃尽了苦头。最后还是如网上的人一样老老实实下载了老的版本,最终从FFMPEG的最新版到4.1.3,再到3.4,最后到3.3,而NDK也从21、17,最后降到14b。最终匹配。所以我最终的方案就是:
ffmpeg-3.3+android-ndk-r14b
NDK的下载很简单,直接在官网的旧版本下载中就很容易找到。而ffmpeg的旧版本下载中并没有提供所有完整的版本的下载。这里附上3.3版本下载的地址:
http://ffmpeg.org/releases/ffmpeg-3.3.tar.gz
二、配置NDK
在NDK下载完成后,需要配置下环境变量:
1.启动终端
2.输入pico .bash_profile 进行编辑
3.
export ANDROID_NDK_HOME=/Users/wangfeng/Documents/hivi/soft/android-ndk-r14b
export ANDROID_SDK_HOME=/Users/wangfeng/Library/Android/sdk
export PATH=$PATH:$ANDROID_NDK_HOME
export PATH=$PATH:$ANDROID_SDK_HOME
export PATH=$PATH:/Users/wangfeng/Documents/hivi/soft/android-ndk-r14b/toolchai$
4.Control+x 保存退出。 Y确认,然后再按Enter.
5.输入 source ~/.bash_profile使改动立即有效。
6.输入ndk-build
如果出现如下提示,则说明配置成功:
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/Users/wangfeng/Documents/hivi/soft/android-ndk-r14b/build/core/build-local.mk:151: *** Android NDK: Aborting . Stop.
三、修改FFMPEG相关文件
接着,将FFMPEG解压后,对configure文件进行修改替换,替换的原因是:编译后的文件会在.so后面加上动态库的版本号,而这种命名格式是不能被Android所能识别的。使用subline打开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)'
注意第二行中间的空格,根据我和网友的试验,有些文章没有空格的,编译会报错。
注意位置顺序不能变。
四、新建脚本文件
在FFMPEG的根目录下,新建build_android.sh文件,内容如下:
#!/bin/bash
make clean
# NDK的路径,根据自己的安装位置进行设置
export TMPDIR=/Users/wangfeng/Documents/hivi/soft/ffmpeg-3.3/ffmpeg_install
export NDK=/Users/wangfeng/Documents/hivi/soft/android-ndk-r14b
export SYSROOT=$NDK/platforms/android-21/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--disable-static \
--disable-doc \
--disable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--enable-postproc \
--enable-avdevice \
--disable-symver \
--disable-stripping \
$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
这里注意,这个TEMPDIR的临时路径,指定的文件夹ffmpeg-install需要自己先创建。
1.接着打开终端,cd到ffmpeg的根目录。
2.赋予脚本权限:chmod +x build_android.sh
3.编译:sh build_android.sh -> /Users/wangfeng/Documents/hivi/soft/ffmpeg-3.3/log.txt
在编译的时候会申请各种各样的权限,我们一路允许,有些权限需要到系统安全设置里去手动授权。
在5分钟左右编译完成之后,在ffmpeg的根目录下。会创建一个android文件夹。
编译完成。
祝各位同僚顺利!