root用户权限,在linux下先建立一个ffmpeg的文件夹。
命令为:mkdir ffmpeg
在此文件夹中下载编译ffmpeg需要的NDK以及ffmpeg的源码。NDK和源码都可以直接用命令直接下载。
下载NDK:wget https://dl.google.com/android/repository/android-ndk-rl14b-linux-x86_64.zip
下载ffmpeg源码:wget http://ffmpeg.org/releases/ffmpeg-3.4.tar.bz2
下载完成后就解压嘛,zip的就用 unzip ...就行,tar的解压tar -xjvf file.tar.bz2
进入到ffmpeg-3.4的文件夹,将已经写好的编译脚本文件复制进去,编译脚本名为:build_android.sh
源文件位于ffmpeg文件夹3.6的zip包中,与下面复制的唯一区别在于NDK的路径有修复
以下为复制:
#!/bin/bash
echo "进入编译ffmpeg脚本"
NDK=/root/ffmpeg/android-ndk-r14b
#5.0
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
#输出路径
PREFIX=./android/$CPU
function buildFF
{
echo "开始编译ffmpeg"
./configure \
--prefix=$PREFIX \
--target-os=android \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--cpu=$CPU \
--sysroot=$PLATFORM \
--extra-cflags="$CFLAG" \
--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-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADD
make -j16
make install
echo "编译结束!"
}
###########################################################
echo "编译支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/armv7-a-neon-hard
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "
ADD="--enable-asm \
--enable-neon \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec "
buildFF
###########################################################
echo "编译不支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/$CPU
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "
ADD=
buildFF
编译跟以前的没什么不同,可以看出,支持的CPU架构为 armv7-a .
PREFIX为输出路径。
neon的意思是协处理器,开启后,可以提高FPS的效率。
make-j16 的意思开启16个线程来编译。
这里有个误区,就是以为硬解码要比软解效率高,其实不然,在多核处理下,软解的性能大多数时候要比硬解要好些。 且硬解在输出帧率是固定的,比如每秒60帧,而软件可以通过代码来控制这个参数。
最后编译代码:
./build_android.sh