使用NDK编译ffmpeg

1,445 阅读1分钟

最近研究音视频,ffmpeg是一个非常著名的开源项目,分享一下自己从0到编译ffmpeg的过程,希望能帮助其他人趟坑。

很多的帖子都推荐编译3.3.6的版本,因为提到高版本都有编译不过的坑,所以我也是编译3.3.6,NDK是android-ndk-r15c,其实编译部分的坑不多,不过,有些帖子的编译脚本编译出来时会少文件的,引入到android项目里面就各种报错。

以下编译流程在linux系统执行,与macos下差异不大 我编译使用的NDK source.propertis

Pkg.Desc = Android NDK
Pkg.Revision = 15.2.4203891

ffmpeg版本

3.36

platform version

android-21

ndk下载路径:

macos

linux

ffmpeg: 3.3.6

很多帖子推荐使用andoird-15,不过我看了我所有的platform version,andorid-21开始才支持arm64架构的编译

创建一个build_andrid.sh

这个文件要在解压后的ffmpeg根目录

#!/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命令开始编译,并传入对应的参数
    ./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 后面的参数即可 注意如果需要直接执行

chmod 777 build_android.sh
./build_android.sh

或者

sh build_android.sh

附上我在manjaro的编译截图