美文网首页Android开发经验谈FFmpegAndroid开发
ffmpeg android ndk编译,还是用的gcc,不会

ffmpeg android ndk编译,还是用的gcc,不会

作者: 毛毛v5 | 来源:发表于2019-05-27 19:51 被阅读2次

    因为google在 NDK R19C中把GCC删除了。本来想着能不能配置出用clang编译ffmpeg,可是折腾了半天还是不行,于是还是用gcc吧。。支持gcc版本的最高的ndk是 NDK R17C,需要下载ndk r17c的开发包。另外最新的x264和ffmpeg代码需要最低 android-23的编译。也就是最低android6.0。因为有个 cabs()函数,只有android6.0才有。基本注意的就这两个方面。1,需要ndk r17c. 2,最低需要定义android-23。
    下面是编译shell.
    系统是centos7.0
    第一个shell脚本是生成交叉编译toolchain

    make_android_toolchain.sh

    #NDK目录 r17c是最后一个支持gcc的ndk
    export NDK_HOME=/home/ndk/android-ndk-r17c
    #生成交叉编译链工具
    toolchain=${NDK_HOME}/build/tools/make-standalone-toolchain.sh
    #生成交叉编译链保存在当前目录子文件夹android-toolchain
    install_root=`pwd`/android-toolchain
    
    #生成32位库最低支持到android4.3,64位库最低支持到android5.0 最新版的ffmpeg,x264需要最低 android-23 就是 android 6.0 因为cabs()等函数。
    platforms=(
      "android-23"
      "android-23"
      "android-23"
      "android-23"
      "android-23"
    )
    #支持以下5种cpu框架
    archs=(
      "arm"
      "arm"
      "arm64"
      "x86"
      "x86_64"
    )
    #cpu型号
    abis=(
      "armeabi"
      "armeabi-v7a"
      "arm64-v8a"
      "x86"
      "x86_64"
    )
    echo $NDK_HOME
    echo "安装在目录:$install_root"
    
    num=${#abis[@]}
    
    for ((i=0; i<num; i++))
    do
       bash $toolchain --arch=${archs[i]} --platform=${platforms[i]} --abis=${abis[i]} --install-dir=$install_root/${abis[i]}
    done
    
    

    android_build_x264.sh

    #!/bin/bash
    
    ROOT=`pwd`/
    #配置交叉编译链,未生成交叉编译链请参考https://github.com/cwj2014/android_toolchain
    export TOOL_ROOT=$ROOT/../android-toolchain
    #五种类型cpu编译链
    android_toolchains=(
       "armeabi"
       "armeabi-v7a"
       "arm64-v8a"
       "x86"
       "x86_64"
    )
    #优化编译项
    extra_cflags=(
       "-march=armv5te -msoft-float -D__ANDROID__ -D__ARM_ARCH_5TE__ -D__ARM_ARCH_5TEJ__"
       "-march=armv7-a -mfloat-abi=softfp -mfpu=neon -mthumb -D__ANDROID__ -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ -D__ARM_ARCH_7R__ -D__ARM_ARCH_7M__ -D__ARM_ARCH_7S__"
       "-march=armv8-a -D__ANDROID__ -D__ARM_ARCH_8__ -D__ARM_ARCH_8A__"
       "-march=i686 -mtune=i686 -m32 -mmmx -msse2 -msse3 -mssse3 -D__ANDROID__ -D__i686__"
       "-march=core-avx-i -mtune=core-avx-i -m64 -mmmx -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -mpopcnt -D__ANDROID__ -D__x86_64__"
    )
    
    extra_ldflags="-nostdlib"
    #共同配置项,可以额外增加相关配置,详情可查看源文件目录下configure
    configure="--disable-cli \
               --enable-static \
               --enable-shared \
               --disable-opencl \
               --enable-strip \
               --disable-cli \
               --disable-win32thread \
               --disable-avs \
               --disable-swscale \
               --disable-lavf \
               --disable-ffms \
               --disable-gpac \
               --disable-lsmash"
    #针对各版本不同的编译项
    extra_configure=(
       "--disable-asm"
       ""
       ""
       "--disable-asm"
       "--disable-asm"
    )
    #交叉编译后的运行环境
    hosts=(
      "arm-linux-androideabi"
      "arm-linux-androideabi"
      "aarch64-linux-android"
      "i686-linux-android"
      "x86_64-linux-android"
    )
    #交叉编译工具前缀
    cross_prefix=(
      "arm-linux-androideabi-"
      "arm-linux-androideabi-"
      "aarch64-linux-android-"
      "i686-linux-android-"
      "x86_64-linux-android-"
    )
    
    #当前目录下x264源文件目录
    if [ ! -d "x264" ]
    then
        echo "下载x264源文件"
        git clone https://code.videolan.org/videolan/x264.git
    fi
    SOURCE=x264
    #安装文件夹
    INSTALL_DIR="x264_install"
    #安装路径,默认安装在当前执行目录下的${INSTALL_DIR}
    PREFIX=$ROOT/$INSTALL_DIR
    
    n=${#android_toolchains[@]}
    
    
    cd $ROOT/$SOURCE
    
    for((i=0; i<n; i++))
    do
       export PATH=$TOOL_ROOT/${android_toolchains[i]}/bin:$PATH
       echo "开始配置${android_toolchains[i]}版本"
       #交叉编译最重要的是配置--host、--cross-prefix、sysroot、以及extra-cflags和extra-ldflags
       ./configure ${configure} \
                   ${extra_configure[i]} \
                   --prefix=$PREFIX/${android_toolchains[i]} \
                   --host=${hosts[i]} \
                   --cross-prefix=${cross_prefix[i]} \
                   --sysroot=$TOOL_ROOT/${android_toolchains[i]}/sysroot \
                   --extra-cflags="${extra_cflags[i]}" \
                   --extra-ldflags="$extra_ldflags"
       make clean
       echo "开始编译并安装${android_toolchains[i]}版本"
       make -j4 & make install
    done
    
    

    android_build_ffmpeg.sh

    #!/bin/bash
    
    ROOT=`pwd`
    
    
    if [ ! -d "ffmpeg-4.1.3" ]
    then
       # echo "解压ffmpeg-4.1.3源文件"
        wget http://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2
        tar -xjvf ffmpeg-4.1.3.tar.bz2
    fi
    
    #当前目录下x264源文件目录
    SOURCE=ffmpeg-4.1.3
    
    #配置交叉编译链,未生成交叉编译链请参考https://github.com/cwj2014/android_toolchain
    export TOOL_ROOT=$ROOT/../android-toolchain
    #五种类型cpu编译链
    android_toolchains=(
       "armeabi"
       "armeabi-v7a"
       "arm64-v8a"
       "x86"
       "x86_64"
    )
    #优化编译项
    extra_cflags=(
       "-std=gnu11 -march=armv5te -msoft-float -D__ANDROID__ -D__ARM_ARCH_5TE__ -D__ARM_ARCH_5TEJ__"
       "-std=gnu11 -march=armv7-a -mfloat-abi=softfp -mfpu=neon -mthumb -D__ANDROID__ -D__ARM_ARCH_7__ -D__ARM_ARCH_7A__ -D__ARM_ARCH_7R__ -D__ARM_ARCH_7M__ -D__ARM_ARCH_7S__"
       "-std=gnu11 -march=armv8-a -D__ANDROID__ -D__ARM_ARCH_8__ -D__ARM_ARCH_8A__"
       "-std=gnu11 -march=i686 -mtune=i686 -m32 -mmmx -msse2 -msse3 -mssse3 -D__ANDROID__ -D__i686__"
       "-std=gnu11 -march=core-avx-i -mtune=core-avx-i -m64 -mmmx -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -mpopcnt -D__ANDROID__ -D__x86_64__"
    )
    
    #共同配置项,可以额外增加相关配置,详情可查看源文件目录下configure
    #--disable-indev=v4l2  #解决libavdevice/v4l2.c:135:9: error: assigning to 'int (*)(int, unsigned long, ...)'
    configure="--enable-gpl \
               --enable-version3 \
               --enable-nonfree \
               --enable-static \
               --enable-shared \
               --enable-small \
               --disable-ffmpeg \
               --disable-doc \
               --disable-htmlpages \
               --disable-manpages \
               --disable-podpages \
               --disable-txtpages \
               --disable-indev=v4l2 \
               --enable-libx264"
    #针对各版本不同的编译项
    extra_configure=(
       "--disable-asm"
       ""
       ""
       "--disable-asm"
       "--disable-asm"
    )
    #交叉编译工具前缀
    cross_prefix=(
      "arm-linux-androideabi-"
      "arm-linux-androideabi-"
      "aarch64-linux-android-"
      "i686-linux-android-"
      "x86_64-linux-android-"
    )
    
    #支持以下5种cpu框架
    archs=(
      "arm"
      "arm"
      "arm64"
      "x86"
      "x86_64"
    )
    
    #安装文件夹
    INSTALL_DIR="ffmpeg_install"
    #安装路径,默认安装在当前执行目录下的${INSTALL_DIR}
    PREFIX=$ROOT/$INSTALL_DIR
    
    #x264安装目录
    X264_INSTALL_DIR=$ROOT/"x264_install"
    #libmp3lame安装目录
    LAME_INSTALL_DIR=$ROOT/"lame_install"
    
    n=${#android_toolchains[@]}
    
    cd $ROOT/$SOURCE
    
    for((i=0; i<n; i++))
    do
       export PATH=$TOOL_ROOT/${android_toolchains[i]}/bin:$PATH
       echo "开始配置${android_toolchains[i]}版本"
       
       #配置额外库头文件和库文件路径
       extra_include="-I$X264_INSTALL_DIR/${android_toolchains[i]}/include -I$LAME_INSTALL_DIR/${android_toolchains[i]}/include"
       extra_lib="-L$X264_INSTALL_DIR/${android_toolchains[i]}/lib -L$LAME_INSTALL_DIR/${android_toolchains[i]}/lib"
        
       #交叉编译最重要的是配置--host、--cross-prefix、sysroot、以及extra-cflags和extra-ldflags
       ./configure ${configure} \
                   ${extra_configure[i]} \
                   --prefix=$PREFIX/${android_toolchains[i]} \
                   --enable-cross-compile \
                   --target-os=android \
                   --arch=${archs[i]} \
                   --cross-prefix=${cross_prefix[i]} \
                   --sysroot=$TOOL_ROOT/${android_toolchains[i]}/sysroot \
                   --extra-cflags="${extra_cflags[i]} $extra_include" \
                   --extra-ldflags="$extra_lib"
       make clean
       echo "开始编译并安装${android_toolchains[i]}版本"
       make -j4 
       make install
    done
    
    

    相关文章

      网友评论

        本文标题:ffmpeg android ndk编译,还是用的gcc,不会

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