参考:https://blog.csdn.net/listener51/article/details/81605472
本文需要用到的工具有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
- 下载安装包并双击执行
-
点击下一步
-
输入想要的安装目录 (建议用英文名且路径不要太长)
-
启动:开始菜单->所有程序->MSYS2 64bit->MSYS2 MinGW-64bit
-
安装基本的工具
pacman -S make yasm diffutils pkg-config
下载FFmpeg
百度网盘下载链接:链接: 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
编译脚本下载:链接: 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.