美文网首页Android
Windows下编译FFmpeg库供Android使用

Windows下编译FFmpeg库供Android使用

作者: 风起于山巅 | 来源:发表于2021-11-07 20:11 被阅读0次

    Windows下编译Android使用的FFmpeg库

    前言

    FFmpeg是一个autoconf项目,cmake那套编译方法就没办法用了,因为autoconf只支持Unix-like的系统,如果想要在Windows系统下编译autoconf项目,可以装一个Linux虚拟机,或者使用MSYS2。同理,其他autoconf项目也可以这样编译。
    谷歌的示例:将 NDK 与其他构建系统配合使用

    1.安装MSYS2

    官网:https://www.msys2.org

    msys2、mingw64环境配置

    1. 这里只需要参照上述博文安装msys2,注意最好不要安装在带空格的路径中

    2. 更新“组件包数据库”和“系统核心组件包”

      执行
      pacman -Syu
      再执行
      pacman -Su
      
    3. 本文使用NDK编译所以不需要安装mingw64

    4. 安装make以及autoconf等工具

      pacman -S base-devel
      

    2.下载FFmpeg

    官网:http://ffmpeg.org

    本文下载的是FFmpeg 4.2.5 "Ada"

    3.编译

    1. 首先将下载的FFmpeg解压到/home/${your name}中,这个目录在MSYS2安装目录下,这里的your name是你自己的用户名

    2. 在同级目录新建一个shell脚本build.sh

    3. 编写脚本,简书排版有问题,完整脚本附在小结最后

    4. 在MSYS的控制台中执行

      sh build.sh
      
    5. 等待最终的运行结果,过程会比较漫长,毕竟MSYS是一个模拟Unix-like系统的软件

    shell脚本如下:

     #!/bin/sh
    
    MY_LIBS_NAME=ffmpeg-4.2.5
    MY_DIR=ffmpeg-4.2.5
    
    # cd ./${MY_DIR}
    
    #编译的过程中产生的中间件的存放目录,为了区分编译目录,源码目录,install目录
    MY_BUILD_DIR=bin
    
    # ndk路径
    NDK_PATH=/d/Compiler/Android/ndk/21.4.7075529
    # 当前编译平台
    BUILD_PLATFORM=windows-x86_64
    # 安卓版本
    API=21
    
    ANDROID_ARMV5_CFLAGS="-march=armv5te"
    ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp
    ANDROID_ARMV8_CFLAGS="-march=armv8-a"
    ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
    ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
    
    
    # params($1:arch,$2:arch_abi,$3:compiler,$4:cross_prefix,$5:cflags)
    build_bin() {
    
        echo "-------------------star build $2-------------------------"
    
        # CPU架构
        ARCH=$1         # arm arm64 x86 x86_64
        # CPU
        ANDROID_ARCH_ABI=$2     # armeabi armeabi-v7a x86 mips
    
        COMPILER=$3
    
        # 安装目录
        PREFIX=$(pwd)/dist/${ANDROID_ARCH_ABI}/
    
        TOOLCHAIN=${NDK_PATH}/toolchains/llvm/prebuilt/${BUILD_PLATFORM}
    
        # 编译器
        CC=${TOOLCHAIN}/bin/${COMPILER}-clang
        # FFmpeg是纯C项目不需要C++编译器
        CXX=${TOOLCHAIN}/bin/${COMPILER}-clang++
    
        # 系统库和头文件
        SYSROOT=${TOOLCHAIN}/sysroot
    
        # 交叉编译工具前缀
        CROSS_PREFIX=${TOOLCHAIN}/bin/$4-
    
        CFLAGS=$5
    
        # build 中间件
        BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}
    
        echo "pwd==$(pwd)"
        echo "ARCH==${ARCH}"
        echo "PREFIX==${PREFIX}"
        echo "SYSROOT=${SYSROOT}"
        echo "CFLAGS=${CFLAGS}"
        echo "CC==${CC}"
        echo "CROSS_PREFIX=${CROSS_PREFIX}"
    
        #echo "-------------------------按任意键继续---------------------"
        #read -n 1
        #echo "-------------------------继续执行-------------------------"
    
        mkdir -p ${BUILD_DIR}   #创建当前arch_abi的编译目录,比如:bin/armeabi-v7a
        cd ${BUILD_DIR}         #此处 进了当前arch_abi的2级编译目录
    
        sh ../../${MY_DIR}/configure \
            --prefix=${PREFIX} \
            --enable-neon \
            --enable-hwaccels \
            --enable-gpl \
            --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 \
            --target-os=android \
            --arch=${ARCH} \
            --cc=$CC \
            --sysroot=$SYSROOT \
            --enable-cross-compile \
            --cross-prefix=${CROSS_PREFIX} \
            --extra-cflags="-Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated $CFLAGS" \
            --extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
            --extra-ldflags="-L${SYSROOT}/usr/lib" \
    
        make clean
        make -j8
        make install
    
        #从当前arch_abi编译目录跳出,对应上面的cd ${BUILD_DIR},以便function多次执行
            cd ../../
    
        echo "-------------------$2 build end-------------------------"
    }
    
    
    # build armeabi
    # build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"
    
    #build armeabi-v7a
    build_bin arm armeabi-v7a armv7a-linux-androideabi${API} arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"
    
    #build arm64-v8a
    # build_bin arm64 arm64-v8a aarch64-linux-android${API} aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"
    
    #build x86
    # build_bin x86 x86 i686-linux-android${API} i686-linux-android "$ANDROID_X86_CFLAGS"
    
    #build x86_64
    # build_bin x86_64 x86_64 x86_64-linux-android${API} x86_64-linux-android "$ANDROID_X86_64_CFLAGS"
    

    4.注意事项

    参考

    编译Android平台使用的FFmpeg(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64)

    1. 上文的脚本只执行了armeabi-v7a,其他架构需要自行开启

    2. 这里特别解释下参数3:compiler,4:cross_prefix。参数3指的是编译器,参数4指的是交叉编译工具前缀,这里如果不是很清楚,可以点开ndk\21.4.7075529\toolchains\llvm\prebuilt\windows-x86_64\bin,本文中用到的NDK版本是21.4.7075529,这里的路径以你自己的为准,其中不带后缀名的就是使用到的参数3,带.exe后缀的就是交叉编译工具。

    3. x86架构需要禁用汇编,否则会报错

      --disable-asm
      

    相关文章

      网友评论

        本文标题:Windows下编译FFmpeg库供Android使用

        本文链接:https://www.haomeiwen.com/subject/dptyzltx.html