FFmpeg4.2.2编译

2,189 阅读1分钟

前言

音视频开发几乎离不开FFmpeg,从事音视频开发也有一段时间了,最近终于有时间可以把相关的知识重新梳理一遍了,第一篇就从FFmpeg编译开始吧。雷神真是可惜了,天妒英才。我们在忙于工作学习的时候,也要注意自己的身体。

准备工作

编译环境:

编译

下载并解压完FFmpeg和NDK之后,就可以正式开始编译流程了。

  • 第一步

    切换到ffmpeg目录下

cd ffmpeg-4.2.2

效果如下图,可以看到ffmpeg的源码目录结构:

  • 第二步

    编写编译脚本build_android_clang.sh:

#!/bin/bash

export NDK=/usr/work/ndk/android-ndk-r21e #这里配置先你的 NDK 路径
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

function build_android
{

./configure \
--prefix=$PREFIX \
--enable-neon  \
--enable-hwaccels  \
--disable-postproc \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-static \
--enable-shared \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"

make clean
make -j16
make install

echo "============================ build android $CPU success =========================="

}

#arm64-v8a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android



#armv7-a
ARCH=arm
CPU=armv7-a
API=21
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

各种编译参数说明可以使用 ./configure --help查看。我这里分别编译了动态库和静态库,可以根据自己的需要修改*--enable-static--enable-shared*

  • 第三步

    先给脚步加可执行权限

    chmod +x build_android_clang.sh
    

    开始运行编译脚本:

    ./build_android_clang.sh
    

    等待一段时间,编译完成之后如图所示:

    此时我们cd 到android目录可以看到已经生成的库文件:

    到这里FFmpeg编译的流程就基本结束了,已经可以正式开始音视频开发了。

  • 其他

    目前编译的结果是多个单独的库文件,如下图:

    其实也可以打包成一个动态库文件libffmpeg.so,打包的原理是将多个静态库打包成一个动态库,修改编译脚本:

    --enable-static
    --disable-shared
    

    打包脚本如下:

    echo "开始编译ffmpeg so"
    
    export NDK=/usr/work/ndk/android-ndk-r21e #这里配置先你的 NDK 路径
    
    PLATFORM=$NDK/platforms/android-21/arch-arm
    TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    
    PREFIX=$(pwd)
    
    $TOOLCHAIN/bin/arm-linux-androideabi-ld \
    -rpath-link=$PLATFORM/usr/lib \
    -L$PLATFORM/usr/lib \
    -L$PREFIX/lib \
    -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
    $PREFIX/libffmpeg.so \
        libavcodec.a \
        libavfilter.a \
        libswresample.a \
        libavformat.a \
        libavutil.a \
        libpostproc.a \
        libswscale.a \
        -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
        $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \
    
    echo "完成编译ffmpeg so"
    
    

    然后到对应静态库目录下执行打包脚本,就不赘述啦。执行完成会生成libffmpeg.so动态库文件。

参考

www.jianshu.com/p/0792f6bbc… blog.csdn.net/u010231682/…