准备
1.MSYS2 https://www.msys2.org/
安装方法:有安装程序,安装到自己方便操作的地方,记得去配置其bin目录的环境变量
2.FFmpeg源码 http://ffmpeg.org/download.html
解压后放入MSYS2目录下\home\你的用户名\中
3.git https://git-scm.com/download/win
安装方法同MSYS2
4.x264源码 https://www.videolan.org/developers/x264.html
想要支持FFmpeg的H264编解码必须先编译x264,放在和源码同样的目录中
5.android ndk https://developer.android.google.cn/ndk/downloads/
我用的是android-ndk-r19c,其他版本应该问题也不大,解压到方便使用的地方
6.熟悉一点Linux常用命令
开始编译
1.编译x264源码
首先安装mingw工具链,在MSYS2根目录下以管理员身份运行mingw64.exe,输入命令 pacman -S mingw-w64-x86_64-toolchain
然后 pacman -S base-devel
和 pacman -S yasm nasm gcc
(这一句可能需要)
在home/用户名
目录下创建一个名为build(可以自定义),后缀为.sh的文件,此为脚本文件
build.sh
内容如下
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}
cd ${basepath}/x264-master
pwd
NDK=D:/android-ndk-r19c-windows-x86_64/android-ndk-r19c
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
PLATFORM=$NDK/platforms/android-21/arch-arm
./configure \
--prefix=/x264_install_android \
--enable-shared \
--enable-pic \
--disable-asm \
--disable-cli \
--host=arm-linux \
--cross-prefix=$PREBUILT/windows-x86_64/bin/arm-linux-androideabi- \
--sysroot=$PLATFORM
make
make install
内容讲解
NDK
则为我们解压的ndk的相应目录,PREBUILT
和PLATFORM
同理,--prefix
用于指定放置编译后文件的目录。--cross-prefix
是交叉编译,需要用到ndk,如果不使用ndk来进行编译,在后续的ffmpeg编译中便会报libx264 not found
的错误。--enable-shared
表示编译的是动态库。
操作步骤
创建好以上文件后启动mingw64.exe,cd到build.sh所在的目录,输入sh build.sh
如果在编译的最后发现报错:libx264.so无法正常生成,因为没有这个文件时,我们可以查看x264_install_android所在的目录,此时so库就在其同级目录中,如果so库后面还有一个数字后缀,可以把该数字删除,然后删除另一个没有数字后缀的so库,因为这个文件是用来连接带有数字后缀的so库的,我们可以删除它,直接使用另一个真正的so库,然后把这个so库放入lib文件夹中。
2.编译FFmpeg
在FFmpeg的根目录中创建build.sh
文件
build.sh内容
#!/bin/bash
NDK=D:/android-ndk-r19c-windows-x86_64/android-ndk-r19c
ADDI_LDFLAGS="-fPIE -pie"
ADDI_CFLAGS="-fPIE -pie -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
CPU=armv7-a
ARCH=arm
HOST=arm-linux
SYSROOT=$NDK/toolchains/llvm/prebuilt/windows-x86_64/sysroot
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64/bin
PREFIX=$(pwd)/android/$CPU
x264=$(pwd)/x264_install_android
export PATH=$x264/bin:$PATH
export PATH=$x264/include:$PATH
export PATH=$x264/lib:$PATH
export PKG_CONFIG_PATH=$x264/lib/pkgconfig:$PKG_CONFIG_PATH
configure()
{
./configure \
--extra-cflags="-I${x264}/include" \
--extra-ldflags="-L${x264}/lib" \
--prefix=$PREFIX \
--toolchain=clang-usan \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--pkg-config=PKG_CONFIG_PATH \
--sysroot=$SYSROOT \
--cc=$TOOLCHAIN/armv7a-linux-androideabi21-clang \
--cxx=$TOOLCHAIN/armv7a-linux-androideabi21-clang++ \
--strip=$TOOLCHAIN/llvm-strip \
--disable-encoders \
--extra-libs=-ldl \
--disable-decoders \
--disable-avdevice \
--disable-static \
--disable-doc \
--disable-ffplay \
--disable-network \
--disable-doc \
--disable-symver \
--disable-ffprobe \
--enable-neon \
--enable-shared \
--enable-gpl \
--enable-libx264 \
--enable-pic \
--enable-jni \
--enable-pthreads \
--enable-mediacodec \
--enable-encoder=aac \
--enable-encoder=gif \
--enable-encoder=libopenjpeg \
--enable-encoder=libmp3lame \
--enable-encoder=libwavpack \
--enable-encoder=libx264 \
--enable-encoder=mpeg4 \
--enable-encoder=pcm_s16le \
--enable-encoder=png \
--enable-encoder=mjpeg \
--enable-encoder=srt \
--enable-encoder=subrip \
--enable-encoder=yuv4 \
--enable-encoder=text \
--enable-decoder=aac \
--enable-decoder=aac_latm \
--enable-decoder=libopenjpeg \
--enable-decoder=mp3 \
--enable-decoder=mpeg4_mediacodec \
--enable-decoder=pcm_s16le \
--enable-decoder=flac \
--enable-decoder=flv \
--enable-decoder=gif \
--enable-decoder=png \
--enable-decoder=srt \
--enable-decoder=xsub \
--enable-decoder=yuv4 \
--enable-decoder=vp8_mediacodec \
--enable-decoder=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-bsf=aac_adtstoasc \
--enable-bsf=h264_mp4toannexb \
--enable-bsf=hevc_mp4toannexb \
--enable-bsf=mpeg4_unpack_bframes
}
build()
{
configure
make clean
make -j4
make install
}
build
内容讲解
--extra-cflags
和--extra-ldflags
分别指定了不在默认目录中的头文件和库文件,也就是我们刚刚编译的x264的include和lib地址,记得不要把-I
和-L
忘了。--cc
和--cxx
是指定c和c++编译器
操作步骤
创建好以上文件后启动mingw64.exe,cd到build.sh所在的目录,输入sh build.sh
注意
ndk请换成自己盘的目录
当出现错误时我们可以查看FFmpeg的ffbuild中的config.log去查看是什么地方出现了问题