ffmpegforandroid编译

  1. 一、简介
  2. 二、编译FFmpeg
  • 1.修改configure
  • 2.脚本
  • 3.配置全架构脚本
    1. 三、编译FFmpeg + libX264 + libfaac
  • 一、简介

    我的环境:
    mac+ndkr13b+ffmpeg3.4.7

    二、编译FFmpeg

    1.修改configure

    需要将 configure 文件里面的名称修改,否则编译后会出现数字。

    修改前:

    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'  
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

    修改后:
    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'

    完成后保存即可。

    2.脚本

    配置的基础脚本如下。
    build.sh 编译架构名称:

    #!/bin/bash

    # 获取指定架构名称
    if [ "$#" -lt 1 ]; then
    THE_ARCH=armv7
    else
    THE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
    fi

    # 查找指定架构参数信息
    case "$THE_ARCH" in
    arm|armv5|armv6|armv7|armeabi)
    # 配置参数
    # toolchain下的文件夹名称前缀
    TOOLCHAIN_LEFT=arm-linux-androideabi
    # android版本下的编译器
    ANDROID_PLATFORMS=arm
    # CMAKE_SYSTEM_PROCESSOR下的配置名称
    PROCESSOR_PLATFORMS=arm
    # prebuilt文件夹下的编译器名称
    TOOLCHAIN_PLEBUILT=arm-linux-androideabi
    # include下全名
    INCLUDE_PLATFORMS=arm-linux-androideabi
    # CFLAGS是否有配置项
    CFLAGS_MARCH="-march=armv5te"
    # 文件夹名称
    BUILD_NAME=armeabi
    ;;
    armv7a|armeabi-v7a)
    # 配置参数
    # toolchain下的文件夹名称前缀
    TOOLCHAIN_LEFT=arm-linux-androideabi
    # android版本下的编译器
    ANDROID_PLATFORMS=arm
    # CMAKE_SYSTEM_PROCESSOR下的配置名称
    PROCESSOR_PLATFORMS=arm
    # prebuilt文件夹下的编译器名称
    TOOLCHAIN_PLEBUILT=arm-linux-androideabi
    # include下全名
    INCLUDE_PLATFORMS=arm-linux-androideabi
    # CFLAGS是否有配置项
    CFLAGS_MARCH="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
    BUILD_NAME=armeabi-v7a
    ;;
    armv8|armv8a|aarch64|arm64|arm64-v8a)
    # 配置参数
    # toolchain下的文件夹名称前缀
    TOOLCHAIN_LEFT=aarch64-linux-android
    # android版本下的编译器
    ANDROID_PLATFORMS=arm64
    # CMAKE_SYSTEM_PROCESSOR下的配置名称
    PROCESSOR_PLATFORMS=aarch64
    # prebuilt文件夹下的编译器名称
    TOOLCHAIN_PLEBUILT=aarch64-linux-android
    # include下全名
    INCLUDE_PLATFORMS=aarch64-linux-android
    # CFLAGS是否有配置项
    CFLAGS_MARCH="-march=armv8-a"
    BUILD_NAME=arm64-v8a
    ;;
    x86)
    # 配置参数
    # toolchain下的文件夹名称前缀
    TOOLCHAIN_LEFT=x86
    # android版本下的编译器
    ANDROID_PLATFORMS=x86
    # CMAKE_SYSTEM_PROCESSOR下的配置名称
    PROCESSOR_PLATFORMS=x86
    # prebuilt文件夹下的编译器名称
    TOOLCHAIN_PLEBUILT=i686-linux-android
    # include下全名
    INCLUDE_PLATFORMS=i686-linux-android
    # CFLAGS是否有配置项
    CFLAGS_MARCH="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
    BUILD_NAME=x86
    ;;
    x86_64|x64)
    # 配置参数
    # toolchain下的文件夹名称前缀
    TOOLCHAIN_LEFT=x86_64
    # android版本下的编译器
    ANDROID_PLATFORMS=x86_64
    # CMAKE_SYSTEM_PROCESSOR下的配置名称
    PROCESSOR_PLATFORMS=x86_64
    # prebuilt文件夹下的编译器名称
    TOOLCHAIN_PLEBUILT=x86_64-linux-android
    # include下全名
    INCLUDE_PLATFORMS=x86_64-linux-android
    # CFLAGS是否有配置项
    CFLAGS_MARCH="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
    BUILD_NAME=x86_64
    ;;
    esac
    # 基本配置
    #ndk所在目录
    NDK_PATH=...Android/sdk/ndk/android-ndk-r13b
    #编译环境这里是 macOS
    BUILD_PLATFORM=darwin-x86_64
    #编译工具链版本
    TOOLCHAIN_VERSION=4.9
    #最低兼容
    ANDROID_VERSION=21

    SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ANDROID_PLATFORMS}
    TOOLCHAIN=${NDK_PATH}/toolchains/${TOOLCHAIN_LEFT}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}/bin/${TOOLCHAIN_PLEBUILT}-
    # 编译后文件路径
    PREFIX=.../ffmpeg-android/obj/${BUILD_NAME}

    mkdir -p ${PREFIX}

    ./configure \
    --prefix=$PREFIX \
    --target-os=android \
    --arch=$PROCESSOR_PLATFORMS \
    --sysroot=$SYSROOT \
    --enable-cross-compile \
    --cross-prefix=$TOOLCHAIN \
    --extra-cflags="$CFLAGS_MARCH -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
    --extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
    --extra-ldflags="-L${SYSROOT}/usr/lib" \
    --enable-shared \
    --enable-runtime-cpudetect \
    --enable-gpl \
    --enable-small \
    --enable-cross-compile \
    --disable-debug \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-postproc \
    --disable-avdevice \
    --disable-symver \
    --disable-stripping

    make clean
    make
    make install

    注意: 这里需要着重注意,由于调用 make install,在编译完成后会将这个ffmpeg安装到本地将原ffmpeg进行覆盖(准确将不是覆盖软件,而是path环境覆盖,原软件并没有被删除或是升级)。需要注意,在编译完成后可以通过在安装软件的路径下卸载即可 make uninstall。这里删除后,覆盖的ffmpeg就会暴露出来,无需再次安装。

    3.配置全架构脚本

    build_all.sh

    for arch in armeabi armeabi-v7a arm64-v8a x86 x86_64
    do
    bash build.sh $arch
    done

    三、编译FFmpeg + libX264 + libfaac