windows编译ffmpeg流程
1、下载安装
NDK https://developer.android.google.cn/ndk/downloads/
MInGW https://sourceforge.net/projects/mingw/files/
yasm http://www.tortall.net/projects/yasm/releases
FFMPEG源码 https://ffmpeg.org/download.html
2、安装NDK
配置环境变量:
配置ndk环境变量path,在其中加入D:\android\android-ndk;
3、MinGW下载安装配置
全部勾选,执行安装点击左上角的installation,然后点击apply change
配置环境变量path,在其中加入两个路径:
;D:\MinGW\bin;
D:\MinGW\msys\1.0\bin
安装完成后执行msys.bat代替window的cmd窗口执行编译命令
4、yasm下载安装
1)下载: http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
2)解压:yasm-1.3.0.tar.gz
3)切换路径: cd yasm-1.3.0
4)执行配置: ./configure
5)编译:make
6)安装:make install
5、FFMPEG源码下载,及修改configure文件,及创建build_android.sh脚本文件
下载解压:
修改configure文件:
# 原来的配置内容:
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)'
新建一个 build_android.sh 脚本文件 , 用于配置及编译使用 (名字不唯一)
#!/bin/sh
NDK_HOME=D:/Android/sdk/ndk-bundle
PREFIX=android-build
HOST_PLATFORM=linux-x86_64
PLATFORM=android-21
COMMON_OPTIONS="\
--target-os=android \
--disable-static \
--enable-shared \
--enable-small \
--enable-cross-compile \
--enable-neon \
--disable-programs \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--disable-asm \
--enable-decoder=h264 \
--enable-decoder=mpeg4 \
--enable-decoder=mjpeg \
--enable-decoder=png \
--enable-decoder=vorbis \
--enable-decoder=opus \
--enable-decoder=flac
"
build_all(){
for version in armeabi armeabi-v7a arm64-v8a x86 x86_64; do
echo "======== > Start build $version"
case ${version} in
armeabi )
ARCH="arm"
CPU="armv5te"
CROSS_PREFIX="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/$HOST_PLATFORM/bin/arm-linux-androideabi-"
SYSROOT="$NDK_HOME/platforms/$PLATFORM/arch-arm/"
EXTRA_CFLAGS="-march=armv5te"
EXTRA_LDFLAGS="-Wl,-L${SYSROOT}/usr/lib"
;;
armeabi-v7a )
ARCH="arm"
CPU="armv7-a"
CROSS_PREFIX="$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/$HOST_PLATFORM/bin/arm-linux-androideabi-"
SYSROOT="$NDK_HOME/platforms/$PLATFORM/arch-arm/"
EXTRA_CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=softfp -mvectorize-with-neon-quad"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L${SYSROOT}/usr/lib"
;;
arm64-v8a )
ARCH="aarch64"
CPU="armv8-a"
CROSS_PREFIX="$NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/$HOST_PLATFORM/bin/aarch64-linux-android-"
SYSROOT="$NDK_HOME/platforms/$PLATFORM/arch-arm64/"
EXTRA_CFLAGS="-march=armv8-a"
EXTRA_LDFLAGS="-Wl,-L${SYSROOT}/usr/lib"
;;
x86 )
ARCH="x86"
CPU="i686"
CROSS_PREFIX="$NDK_HOME/toolchains/x86-4.9/prebuilt/$HOST_PLATFORM/bin/i686-linux-android-"
SYSROOT="$NDK_HOME/platforms/$PLATFORM/arch-x86/"
EXTRA_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
EXTRA_LDFLAGS="-Wl,-L${SYSROOT}/usr/lib"
;;
x86_64 )
ARCH="x86_64"
CPU="x86_64"
CROSS_PREFIX="$NDK_HOME/toolchains/x86_64-4.9/prebuilt/$HOST_PLATFORM/bin/x86_64-linux-android-"
SYSROOT="$NDK_HOME/platforms/$PLATFORM/arch-x86_64/"
EXTRA_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
EXTRA_LDFLAGS="-Wl,-L${SYSROOT}/usr/lib"
;;
esac
echo "-------- > Start clean workspace"
make clean
echo "-------- > Start config makefile"
configuration="\
--prefix=${PREFIX} \
--libdir=${PREFIX}/libs/${version}
--incdir=${PREFIX}/includes/${version} \
--pkgconfigdir=${PREFIX}/pkgconfig/${version} \
--arch=${ARCH} \
--cpu=${CPU} \
--cross-prefix=${CROSS_PREFIX} \
--sysroot=${SYSROOT} \
--extra-ldexeflags=-pie \
${COMMON_OPTIONS}
"
echo "-------- > Start config makefile with ${configuration}"
./configure ${configuration}
echo "-------- > Start make ${version} with -j8"
make j8
echo "-------- > Start install ${version}"
make install
echo "++++++++ > make and install ${version} complete."
done
}
echo "-------- Start --------"
build_all
echo "-------- End --------"
打开msys.bat进入ffmpeg目录
然后输入
$chmod 777 build_android.sh
./build_android.sh
编译完成,会在ffmpeg源码文件夹中生成一个android-build文件
可能错误:libavformat/os_support.c:194:10: error: 'ERROR_NOT_ENOUGH_MEMORY' undeclared (first use in this function)
解决方法:在FFmpeg\libavformat\os_support.h
的开始加上#include "winerror.h"