Window7 64bit上为Android NDK配置FFmpeg4.3.1编译 - MSYS2

参考:https://blog.csdn.net/listener51/article/details/81605472

          https://www.msys2.org/

本文需要用到的工具有MSYS2,NDK21,FFmpeg源码是4.3.1, windows版本是win7 64bit.

本文将从工具安装到源码编译一步一步阐述,并提供完整的编译脚本

MSYS2安装准备

  • 操作系统为Windows 7 (64 bit) 或更新版本
  • 下载安装包: msys2-x86_64-20200720.exe

  • SHA256 校验码: ad6b58b355a852d9df7c6dc2722d0eca139042cf262ae7363e0a5e7dd2a6c5c9

  • 百度网盘下载链接:链接: https://pan.baidu.com/s/1vXt1gHkz7kELQexAPYMRNg 提取码: rapm

安装MSYS2

  1. 下载安装包并双击执行
  2. 点击下一步

  3. 输入想要的安装目录 (建议用英文名且路径不要太长)

  4. 启动:开始菜单->所有程序->MSYS2 64bit->MSYS2 MinGW-64bit

  5. 安装基本的工具

    pacman -S make yasm diffutils pkg-config
    

 

MSYS2安装基本工具截图

下载FFmpeg

官网:http://ffmpeg.org/

百度网盘下载链接:链接: https://pan.baidu.com/s/1a81uxPgzdmpk5g2VCXUcKw 提取码: rxsp

我解压的路径是:E:\tools\ffmpeg\ffmpeg-4.3.1

下载和安装NDK

百度网盘下载链接:链接:https://pan.baidu.com/s/1kFWnO9h0z8MzPPBl8Mdv9w 提取码:ob0k 

我的安装路径是:E:\tools\Android\SDK\android-ndk-r21d

编译ffmpeg

ffmpeg_build

编译脚本下载:链接: https://pan.baidu.com/s/1axHWsa4O3OPrkDgIaZOPSg 提取码: q5bt

编译脚本内容

#!/bin/bash

#set temp path
export TMPDIR=`dirname $0`/tmpdir

#set ffmpeg source path
export SRC_PATH=E:/project/ffmpeg

#set ndk path
#NDK=E:/tools/Android/SDK/android-ndk-r21d
NDK=E:/tools/Android/SDK/ndk/21.3.6528147
#set api version
API=29
# arm aarch64 i686 x86_64
#ARCH=aarch64

#linux-x86_64 windows-x86_64
#host is windows 64 bit
HOST_TAG=windows-x86_64

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG/bin
SYSROOT=$NDK/sysroot


CFLAG="-D__ANDROID_API__=$API -U_FILE_OFFSET_BITS -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD -Os -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm"

#create tmep directory
mkdir -p $TMPDIR

#support configure armeabi-v7a and arm64-v8a
configure()
{
    echo "NDK = $NDK"
    #get the parameter
    TARGET_CPU=$1
    mkdir -p `dirname $0`/Android/$TARGET_CPU
    if [ "$TARGET_CPU" == "armeabi-v7a" ];then
        echo "build 32bit lib"
        ARCH=arm
        TARGET=armv7a-linux-androideabi
        CROSS_PREFIX=$TOOLCHAIN/arm-linux-androideabi-
        CC=$TOOLCHAIN/$TARGET$API-clang
        CXX=$TOOLCHAIN/$TARGET$API-clang++
        #translate the cpu string
        CPU="armv7-a"
    else
        echo "build 64bit lib"
        ARCH=aarch64
        TARGET=aarch64-linux-android
        CROSS_PREFIX=$TOOLCHAIN/aarch64-linux-android-
        CC=$TOOLCHAIN/$TARGET$API-clang
        CXX=$TOOLCHAIN/$TARGET$API-clang++
        #translate the cpu string
        CPU="armv8-a"
    fi
    PREFIX=`dirname $0`/Android/$TARGET_CPU
    echo "try configure $TARGET_CPU and prefix is $PREFIX"
    ./configure \
    --ln_s="cp -rf" \
    --prefix=$PREFIX \
    --cc=$CC \
    --cxx=$CXX \
    --ld=$CC \
    --target-os=android \
    --arch=$ARCH \
    --cpu=$CPU \
    --cross-prefix=$CROSS_PREFIX \
    --disable-x86asm \
    --disable-asm \
    --enable-cross-compile \
    --enable-shared \
    --disable-static \
    --enable-runtime-cpudetect \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-symver \
    --enable-small \
    --enable-gpl --enable-nonfree --enable-version3 --disable-iconv \
    --enable-jni \
    --enable-mediacodec \
    --disable-decoders --enable-decoder=vp9 --enable-decoder=h264 --enable-decoder=mpeg4 --enable-decoder=aac \
    --disable-encoders --enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \
    --disable-demuxers --enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \
    --disable-muxers --enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \
    --disable-parsers --enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \
    --disable-protocols --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \
    --disable-bsfs \
    --disable-indevs --enable-indev=v4l2 \
    --disable-outdevs \
    --disable-filters \
    --disable-postproc \
    --extra-cflags="$CFLAG" \
    --extra-ldflags="-marm"
}

build_one()
{
    TARGET_CPU=$1
    echo "configure $TARGET_CPU"
    configure $TARGET_CPU
    echo "build $TARGET_CPU"
    #need to call make clean if you want to build for more than one target
    make clean
    make -j32
    echo "build $TARGET_CPU done"
    make install
    echo "install $TARGET_CPU done"
}

#the entry
build_all()
{
    build_one armeabi-v7a
    build_one arm64-v8a
}

#call the entry
build_all

常见错误说明

如果出现类似下面的错误,说明NDK路径没有配置正确,也有可能是32位环境编译64bit lib,也有可能是configure的cpu参数设置有问题,我有一次设置为armeabi-v7a和arm64-v8a,无法编译出64bit lib,修改方法是将起修改为armv7-a和armv8-a,见脚本加粗的地方

详细原因可以查看ffbuild/config.log

E:/tools/Android/SDK/adroid-ndk-r21d/toolchains/llvm/prebuilt/windows-x86_64/bin/armv7a-linux-androideabi29-clang is unable to create an executable file.
C compiler test failed.
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值