记一次编译ffmpeg过程:
环境准备
- ubuntu16.04 我是64位,所以还要额外安装32位依赖库
- ndk环境
首先去官网下载最新的源码:ffmpeg4.0.2
随便解压到一个目录,先运行一次命令./configure,如果没错可以进行下一步操作,编写脚本
新建一个xxx.sh文件,往里面写入如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #!/bin/bash
NDK=/opt/android-ndk-r14b #ndk目录 SYSROOT=$NDK/platforms/android-14/arch-arm/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 CPU=armv7-a #需要编译哪种架构的so库 PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
function build_android { ./configure \ --prefix=$PREFIX \ #规定编译文件在哪里生成 --enable-neon \ --enable-hwaccels \ --enable-shared \ #生成动态库(共享库) --target-os=android \ #目标系统 --enable-jni \ --enable-mediacodec \ #硬解码支持 --enable-decoder=h264_mediacodec \ --disable-static \ #禁止生成静态库 --disable-doc \ --enable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --enable-avdevice \ --disable-doc \ --disable-symver \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ #交叉编译链 --arch=arm \ #目标平台架构 --cpu=armv7-a \ --enable-cross-compile \ #启用交叉编译方式 --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG } build_android
|
放入解压之后的根目录,我这里命名为build.sh。然后在终端执行命令 bash build.sh。我第一次编译提示如下错误jni not found:

找了搜索好几天无果,后面拿着log结合别的文章看了又看,觉得可能是ndk版本的问题,于是换成r14,结果编译成功了。
ndk-r16版本:

ndk-r14版本:

主要是缺失了include文件夹,include文件夹里有个jni.h头文件,所以会报错jni not found。
然后再次运行脚本,没有错误,就执行下面两个命令:
编译完成后,在当前目录下的android/arm/下会有inclue 和 lib两文件夹 inclue 存放的是相关模块的.h文件,lib 存放的就是.so文件
最后放上ffmpeg编译好的github地址:ffmpeg_build_demo