windows下编译android使用的FFmpeg库

去年写了篇在ubuntu下用NDK编译FFmpeg,当时是费了很大的劲才编译出几个so库!并不是每个人都有Ubuntu的,要弄属于自己的FFmpeg库就比较困难,正好这几天公司不是很忙,于是在网络中寻找如何在windows下编译出FFmpeg库!  搜集加整理加实践最终得到FFmpeg!

准备:win10, NDK(具体什么版本我也忘了,在AndroidStudio里面下载的,感觉版本什么的问题不大), ffmpeg3.0.9, MinGW

先说一下这个MinGW,这个在官网下载,他会提供一个下载器给你,在线安装即可!之后把安装的bin目录配置到系统环境变量的Path里


解压下载的ffmpeg-3.0.9,下面要开始了!!!!

手动在ffmpeg-3.0.9目录下新建一个文本文件,取名build_android.sh将下列内容粘贴进去

#!/bin/bash
#设置编译中临时文件目录,不然会报错 unable to create temporary file
export TMPDIR=F:/zwyl/ffmpeg-3.0.9/ffmpegtemp
# NDK的路径,根据实际安装位置设置
NDK=F:/AStudioSDK/ndk-bundle
# 编译针对的平台,这里选择最低支持android-14, arm架构,生成的so库是放在libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具链的路径,arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

function build_one
{

./configure \
    --prefix=$PREFIX \
    --target-os=linux \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --arch=arm \
    --sysroot=$PLATFORM \
    --extra-cflags="-I$PLATFORM/usr/include" \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
    --disable-shared \
    --enable-runtime-cpudetect \
    --enable-gpl \
    --enable-small \
    --enable-cross-compile \
    --disable-debug \
    --enable-static \
    --disable-doc \
    --disable-asm \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-postproc \
    --disable-avdevice \
    --disable-symver \
    --disable-stripping \

$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h

make clean
make -j4
make install

$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
    libavcodec/libavcodec.a \
    libavfilter/libavfilter.a \
    libswresample/libswresample.a \
    libavformat/libavformat.a \
    libavutil/libavutil.a \
    libswscale/libswscale.a \
    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
    $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a \
	
}

# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU-vfp
ADDITIONAL_CONFIGURE_FLAG=
build_one

# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one

#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
# build_one        

说明:这是个shell脚本文件#一般表示注释,修改好自己的NDK目录,ffmpegtemp目录先新建好,用来缓存的

用notepad++ 打开该脚本,在编辑里面有个文档格式转换,选中转换为UNIX格式,虽说是在windows下,但是脚本要运行还是要使用unix格式

在MinGW的安装目录下找到msys.bat文件,我的在这个目录下:  C:\MinGW\msys\1.0 然后双击运行,接着cd到ffmpeg-3.0.9目录下

给build_android.sh权限,输入 chmod +x build_android.sh然后就是运行

输入  ./build_android.sh回车即可


可能是我的电脑慢的问题,回车后没反应,不要急,大概半个小时就好了(电脑配置造成的吧)    

最后会在该目录下生成一个android文件夹

中间碰到一个问题报SYNTAX ERROR:UNEXPECTED END OF FILE错误

网上查了说是因为没有转格式,但是转了格式还是报错,结果我把环境切到linux下运行(装了双系统),报的错不一样,因为语法错了,找了半天是因为在方法体里面少了个回车,这都被我发现了!

好了,可以愉快的使用ffmpeg玩耍了,具体怎么玩,可以参见雷神的博客






猜你喜欢

转载自blog.csdn.net/qq_26617627/article/details/78215234