Win10编译Android版本的FFmpeg库
创始人
2024-03-22 20:14:41
0

安装MSYS2

下载地址:MSYS2

安装完成后打开MSYS2执行如下命令, 安装所需要的工具链

pacman -S --needed base-devel mingw-w64-x86_64-toolchain

下载android NDK

我在Android Studio里面已经下载过了,没有的可以自己百度去官网下载NDK

我用的21.4.7075529这个版本NDK

下载ffmpeg源码

git clone git@github.com:FFmpeg/FFmpeg.git

切换至release/4.4分支

编译FFmpeg

FFmpeg4.4以及以上版本不需要对configure修改,忽略就行

在ffmpeg的文件下找到configure,用编辑器打开

  • 找到 --cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix]
    在其下面加一行

--cross-prefix-clang=PREFIX use PREFIX for compilation clang tools [$cross_prefix]

  • 找到 CMDLINE_SET= ..... corss_prefix
    在其下面添加一行:

cross_prefix_clang

  • 找到
set_default target_os
if test "$target_os" = android; thencc_default="clang"
fiar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
cxx_default="${cross_prefix}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"

替换成:

set_default target_os
if test "$target_os" = android; thencc_default="clang"cxx_default="clang++"
fi
ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix_clang}${cc_default}"
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
  • 找到
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)'

保存文件,使用MSYS2 MINGW64进入到ffmpeg根目录下执行./configure --disable-x86asm
来跑一边配置文件

编写编译脚本,如下所示

#!/bin/bash
# 用于编译android平台的脚本# NDK所在目录
NDK_PATH=D:/android/SDK/Sdk/ndk/21.4.7075529 # tag1
# macOS 平台编译,其他平台看一下 $NDK_PATH/toolchains/llvm/prebuilt/ 下的文件夹名称
HOST_PLATFORM=windows-x86_64  #tag1
# minSdkVersion
API=23TOOLCHAINS="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM"
SYSROOT="$NDK_PATH/toolchains/llvm/prebuilt/$HOST_PLATFORM/sysroot"
# 生成 -fpic 与位置无关的代码
CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "
LDFLAG="-lc -lm -ldl -llog "# 输出目录
PREFIX=`pwd`/android-build
# 日志输出目录
CONFIG_LOG_PATH=${PREFIX}/log
# 公共配置
COMMON_OPTIONS=
# 交叉配置
CONFIGURATION=build() {APP_ABI=$1echo "======== > Start build $APP_ABI"case ${APP_ABI} inarmeabi-v7a)ARCH="arm"CPU="armv7-a"MARCH="armv7-a"TARGET=armv7a-linux-androideabiCC="$TOOLCHAINS/bin/$TARGET$API-clang"CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"LD="$TOOLCHAINS/bin/$TARGET$API-clang"# 交叉编译工具前缀CROSS_PREFIX="$TOOLCHAINS/bin/arm-linux-androideabi-"EXTRA_CFLAGS="$CFLAG -mfloat-abi=softfp -mfpu=vfp -marm -march=$MARCH "EXTRA_LDFLAGS="$LDFLAG"EXTRA_OPTIONS="--enable-neon --cpu=$CPU ";;arm64-v8a)ARCH="aarch64"TARGET=$ARCH-linux-androidCC="$TOOLCHAINS/bin/$TARGET$API-clang"CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"LD="$TOOLCHAINS/bin/$TARGET$API-clang"CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"EXTRA_CFLAGS="$CFLAG"EXTRA_LDFLAGS="$LDFLAG"EXTRA_OPTIONS="";;x86)ARCH="x86"CPU="i686"MARCH="i686"TARGET=i686-linux-androidCC="$TOOLCHAINS/bin/$TARGET$API-clang"CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"LD="$TOOLCHAINS/bin/$TARGET$API-clang"CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"#EXTRA_CFLAGS="$CFLAG -march=$MARCH -mtune=intel -mssse3 -mfpmath=sse -m32"EXTRA_CFLAGS="$CFLAG -march=$MARCH  -mssse3 -mfpmath=sse -m32"EXTRA_LDFLAGS="$LDFLAG"EXTRA_OPTIONS="--cpu=$CPU ";;x86_64)ARCH="x86_64"CPU="x86-64"MARCH="x86_64"TARGET=$ARCH-linux-androidCC="$TOOLCHAINS/bin/$TARGET$API-clang"CXX="$TOOLCHAINS/bin/$TARGET$API-clang++"LD="$TOOLCHAINS/bin/$TARGET$API-clang"CROSS_PREFIX="$TOOLCHAINS/bin/$TARGET-"#EXTRA_CFLAGS="$CFLAG -march=$CPU -mtune=intel -msse4.2 -mpopcnt -m64"EXTRA_CFLAGS="$CFLAG -march=$CPU -msse4.2 -mpopcnt -m64"EXTRA_LDFLAGS="$LDFLAG"EXTRA_OPTIONS="--cpu=$CPU ";;esacecho "-------- > Start clean workspace"make cleanecho "-------- > Start build configuration"CONFIGURATION="$COMMON_OPTIONS"CONFIGURATION="$CONFIGURATION --logfile=$CONFIG_LOG_PATH/config_$APP_ABI.log"CONFIGURATION="$CONFIGURATION --prefix=$PREFIX"CONFIGURATION="$CONFIGURATION --libdir=$PREFIX/libs/$APP_ABI"CONFIGURATION="$CONFIGURATION --incdir=$PREFIX/includes/$APP_ABI"CONFIGURATION="$CONFIGURATION --pkgconfigdir=$PREFIX/pkgconfig/$APP_ABI"CONFIGURATION="$CONFIGURATION --cross-prefix=$CROSS_PREFIX"CONFIGURATION="$CONFIGURATION --arch=$ARCH"CONFIGURATION="$CONFIGURATION --sysroot=$SYSROOT"CONFIGURATION="$CONFIGURATION --cc=$CC"CONFIGURATION="$CONFIGURATION --cxx=$CXX"CONFIGURATION="$CONFIGURATION --ld=$LD"# nm 和 stripCONFIGURATION="$CONFIGURATION --nm=$TOOLCHAINS/bin/llvm-nm"CONFIGURATION="$CONFIGURATION --strip=$TOOLCHAINS/bin/llvm-strip"CONFIGURATION="$CONFIGURATION $EXTRA_OPTIONS"echo "-------- > Start config makefile with $CONFIGURATION --extra-cflags=${EXTRA_CFLAGS} --extra-ldflags=${EXTRA_LDFLAGS}"./configure ${CONFIGURATION} \--extra-cflags="$EXTRA_CFLAGS" \--extra-ldflags="$EXTRA_LDFLAGS"echo "-------- > Start make $APP_ABI with -j1"make -j1echo "-------- > Start install $APP_ABI"make installecho "++++++++ > make and install $APP_ABI complete."}build_all() {#配置开源协议声明COMMON_OPTIONS="$COMMON_OPTIONS --enable-gpl"#目标android平台COMMON_OPTIONS="$COMMON_OPTIONS --target-os=android"#取消默认的静态库COMMON_OPTIONS="$COMMON_OPTIONS --disable-static"COMMON_OPTIONS="$COMMON_OPTIONS --enable-shared"COMMON_OPTIONS="$COMMON_OPTIONS --enable-protocols"#开启交叉编译COMMON_OPTIONS="$COMMON_OPTIONS --enable-cross-compile"COMMON_OPTIONS="$COMMON_OPTIONS --enable-optimizations"COMMON_OPTIONS="$COMMON_OPTIONS --disable-debug"#尽可能小COMMON_OPTIONS="$COMMON_OPTIONS --enable-small"COMMON_OPTIONS="$COMMON_OPTIONS --disable-doc"#不要命令(执行文件)COMMON_OPTIONS="$COMMON_OPTIONS --disable-programs"  # do not build command line programsCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffmpeg"    # disable ffmpeg buildCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffplay"    # disable ffplay buildCOMMON_OPTIONS="$COMMON_OPTIONS --disable-ffprobe"   # disable ffprobe buildCOMMON_OPTIONS="$COMMON_OPTIONS --disable-symver"COMMON_OPTIONS="$COMMON_OPTIONS --disable-network"COMMON_OPTIONS="$COMMON_OPTIONS --disable-x86asm"COMMON_OPTIONS="$COMMON_OPTIONS --disable-asm"#启用COMMON_OPTIONS="$COMMON_OPTIONS --enable-pthreads"COMMON_OPTIONS="$COMMON_OPTIONS --enable-mediacodec"COMMON_OPTIONS="$COMMON_OPTIONS --enable-jni"COMMON_OPTIONS="$COMMON_OPTIONS --enable-zlib"COMMON_OPTIONS="$COMMON_OPTIONS --enable-pic"COMMON_OPTIONS="$COMMON_OPTIONS --enable-muxer=flv"#COMMON_OPTIONS="$COMMON_OPTIONS --enable-avresample"COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=h264"COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mpeg4"COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=mjpeg"COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=png"COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=vorbis"COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=opus"COMMON_OPTIONS="$COMMON_OPTIONS --enable-decoder=flac"echo "COMMON_OPTIONS=$COMMON_OPTIONS"echo "PREFIX=$PREFIX"echo "CONFIG_LOG_PATH=$CONFIG_LOG_PATH"mkdir -p ${CONFIG_LOG_PATH}build "armeabi-v7a"build "arm64-v8a"build "x86"build "x86_64"
}echo "-------- Start --------"
build_all
echo "-------- End --------"

需要自己替换对应目录
我使用的api是23
将完成的脚本保存为build_android.sh,放到源码目录

编译

打开MSYS2 MINGW64,跳转到源码目录中,运行脚本

chmod +x build_android.sh
./build_android.sh

大概需要等半个小时。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...