多语言展示
当前在线:154今日阅读:2今日分享:31

ffmpeg编译支持MediaCodec

MediaCodec是android提供的一套编解码的接口,跟底层硬件是分离的,可以直接使用底层的硬件加速来编解码音视频,那么ffmpeg怎么把这个mediaCodec集成进去了??
工具/原料
1

ffmepg

2

linux,ndk,mediacodec

方法/步骤
2

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

3

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

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

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的

注意事项

仅供学习参考

推荐信息