ffmpeg编译支持MediaCodec
1、下载源码,在百度上搜索下载ffmpeg的源码(我下的是3.14的),ffmpeg的源码在不断的更新,每个版本更新都会标明作了什么修改,可以查更新日志,ffmpeg官网显示是已经支持mediacodec

2、通过查阅ffmepg的官方文档,如下图所示,只支持mediacodec的解码使用


3、准备编译脚本
#!/bin/bash
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=/root/android/androidcrosstool
function build_one
{
./configure \
--prefix=/root/android/ffmpeg-3.1.4/android/armv7-a \
--enable-shared \
--disable-static \
--disable-programs\
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-htmlpages\
--disable-manpages \
--disable-podpages \
--disable-txtpages \
--enable-swresample \
--disable-debug \
--disable-symver \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-memalign-hack \
--enable-gpl \
--enable-nonfree \
--enable-version3 \
--enable-asm \
--enable-cross-compile \
--enable-filter=scale \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--cpu=armv7-a \
--enable-neon\
--sysroot=$SYSROOT \
--extra-cflags=" -march=armv7-a -mfpu=neon " \
--extra-ldflags="-Wl, -lc -lm -ldl -llog " \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
build_one
主要的部份已经在下图用红色框标注了

4、在配置之前,需要注意一点,因为android只能识别.so结尾的动态库,新版本的ffmpeg在编译生成后,它的文件名不是以.so结尾的,需要作一些修改让它以.so结尾
打开ffmpeg源码目录下的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)'
具体参考下图

5、打开终端,进入ffmpeg的源码目录,运行配置脚本,
配置通过后再执行 make -j8 编译
编译通过后再执行 make install 安装到指定的目录

6、这里也写一下使用方法
首先要在程序初始化的时候调用 av_jni_set_java_vm(vm, NULL);
要注意包含头文件的时候别忘了像下面这样加上 extern "C",不然会提示找不到av_jni_set_java_vm的
然后是在初始化解码器这前,把那些软件解码器强行换成mediacodec支持的硬件解码器
这样子基本上跟平常使用ffmpeg是一样的了
另外要注意的是找5.0以上的android才行
如果你不知道,它支持那些mediacodec解码,你可以使用./configure --list-decoders 来查看,3.14版本的只支持h264的
