- 方案选择
Android中集成ffmpeg的codec功能无非两种方式:
- JNI直接调用,主要用于App开发(无权限修改系统底层),如EXOPlayer,JPlayer等。
- 集成ffmpeg到OMX,即封装ffmpeg为OMX的plugin,然后实现component接口。
考虑到性能问题,我选取的方案二即集成ffmpeg到OMX。首先第一个问题就是ffmpeg的编译。也有两种方式:
- 集成ffmpeg源码到整个Android系统工程,独立写bp或mk进行编译。(由于ffmpeg配置复杂,参考网上的一些现成mk进行修改发现工作量比较巨大)
- 独立NDK编译ffmpeg成动态库或静态库,然后通过prebuild的方式集成。(由于OMX的plugin是直接动态加载动态库,无编译上的依赖,此种方法编译跟普通的ffmpeg编译类似,故推荐该方法)
- FFmpeg配置
32bit编译配置:
1 #!/bin/bash 2 3 chmod 777 ./configure 4 #chmod 777 ./version.sh 5 NDK=/your_ndk_path/android-ndk-r16b 6 SYSROOT=$NDK/platforms/android-27/arch-arm 7 TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 8 CROSS=$TOOLCHAIN/bin/arm-linux-androideabi- 9 10 ISYSROOT=$NDK/sysroot 11 ASM=$ISYSROOT/usr/include/arm-linux-androideabi 12 CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc 13 NM=$TOOLCHAIN/bin/arm-linux-androideabi-nm 14 15 CPU=arm 16 PREFIX=./android/$CPU 17 ADDI_CFLAGS="-marm" 18 19 function build_one 20 { 21 ./configure \ 22 --prefix=$PREFIX \ 23 --target-os=linux \ 24 --arch=$CPU \ 25 --enable-cross-compile \ 26 --incdir=$NDK/sysroot/usr/include \ 27 --sysroot=$SYSROOT \ 28 --cross-prefix=$CROSS \ 29 --cc=$CC \ 30 --nm=$NM \ 31 --extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic $ADDI_CFLAGS" \ 32 --enable-shared \ 33 --enable-static \ 34 --disable-asm \ 35 --enable-pic \ 36 --disable-doc \ 37 --disable-ffmpeg \ 38 --disable-ffplay \ 39 --disable-ffprobe \ 40 --disable-ffserver \ 41 --disable-avdevice \ 42 --disable-doc \ 43 --disable-symver \ 44 --disable-debug \ 45 --disable-encoders \ 46 --disable-muxers \ 47 --enable-avresample \ 48 --disable-pthreads \ 49 --enable-swresample 50 make 51 make install 52 } 53 54 rm -rf $PREFIX 55 make distclean 56 build_one