ffmepg
linux,ndk,mediacodec
2、通过查阅ffmepg的官方文档,如下图所示,只支持mediacodec的解码使用
3、准备编译脚本#!/bin/bashSYSROOT=$NDK/platforms/android-9/arch-arm/TOOLCHAIN=/root/android/androidcrosstoolfunction 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/$CPUbuild_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)'具体参考下图
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的
仅供学习参考