最近研究音视频,ffmpeg 是一个非常著名的开源项目,分享一下自己从 0 到编译 ffmpeg 的过程,希望能帮助其他人趟坑。
很多的帖子都推荐编译 3.3.6 的版本,因为提到高版本都有编译不过的坑,所以我也是编译 3.3.6,NDK 是 android-ndk-r15c,其实编译部分的坑不多,不过,有些帖子的编译脚本编译出来时会少文件的,引入到 android 项目里面就各种报错。
以下编译流程在 linux 系统执行,与 macos 下差异不大
我编译使用的 NDK source.propertis
1 2
| Pkg.Desc = Android NDK Pkg.Revision = 15.2.4203891
|
ffmpeg 版本
ndk 下载路径:
macos
linux
ffmpeg:
3.3.6
很多帖子推荐使用 andoird-15,不过我看了我所有的 platform version,andorid-21 开始才支持 arm64 架构的编译
创建一个 build_andrid.sh
这个文件要在解压后的 ffmpeg 根目录
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| #!/bin/bash cd `dirname $0` #临时缓存路径,如果使用一定要确保文件夹存在 export TMPDIR=/home/nightmare/文档/Android_Project/tempdir #ndk的根目录 NDK=/home/nightmare/Android/Ndk/android-ndk-r15c #以下就是一个编译执行的函数 configure() { #$1代表这个函数收到的第一个参数 CPU=$1 #输出目录 PREFIX=$(pwd)/android/$CPU #编译平台版本 ARCH="" #交叉编译可执行文件的头部分,在bin文件夹,有一系列arm-linux-androideabi-开头的可执行程序 #如arm-linux-androideabi-gcc,但编译时只需要它的头部部分 CROSS_PREFIX="" #所选使用的编译版本路径 SYSROOT="" if [ "$CPU" == "armv7-a" ] then ARCH="arm" SYSROOT=$NDK/platforms/android-21/arch-arm/ CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi- else ARCH="aarch64" SYSROOT=$NDK/platforms/android-21/arch-arm64/ CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android- fi echo "start build ffmpeg for $ARCH" # ./configure --target-os=linux \ --prefix=$PREFIX --arch=$ARCH \ --disable-doc \ --disable-static \ --disable-yasm \ --disable-asm \ --disable-symver \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --cross-prefix=$CROSS_PREFIX \ --enable-cross-compile \ --enable-shared \ --enable-gpl \ --sysroot=$SYSROOT \ --enable-small \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG }
build() { make clean cpu=$1 echo "build $cpu"
configure $cpu #-j<CPU核心数> make -j8 make install echo "build ffmpeg for $ARCH finished" }
build arm64 # build armv7-a
|
这是我的环境使用的编译脚本,请务必将其中的环境变量改为自己环境对应的路径,已经补充上了很多注释,并且执行脚本的时候不需要手动切换 pwd 路径为 ffmpeg 根目录
最后两行极为一键编译的命令,只需要更改 build 后面的参数即可
注意如果需要直接执行
1 2
| chmod 777 build_android.sh ./build_android.sh
|
或者
附上我在 manjaro 的编译截图