最新版FFmpeg4.1 Android库Windows交叉编译(成功)

  • 概述

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。官方提供了Windows、Mac OS X等多个平台的二进制包,可惜没有Android版本库。

  • 编译阶段

1、下载最新版本Ffmpeg源码(目前官方发布的最新版本为1.1),下载地址:https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2

2、我编译使用的NDK版本android-ndk-r16b, 下载地址:https://dl.google.com/android/repository/android-ndk-r16b-windows-x86_64.zip

3、交叉编译工具MinGW,下载地址: http://www.mingw.org/

安装时其实先装的是个下载管理器,到选择安装选项的时候要选上msys-base和mingw32-gcc-ada两项

4、为了满足Android对库文件的调用格式,需要修改一个configure文件【文件位置:ffmpeg-4.1/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)’

总共四行

5、最重要的是编写下面的脚本

#!/bin/bash

export TMPDIR=F:/SVNMgr/projects/glasses/ffmegp_android_compile/ffmpeg-4.1/ffmpegtemp

#F:/demo/ffmpeg-3.0/ffmpegtemp #设置编译中临时文件目录,不然会报错 unable to create temporary file

 

# NDK的路径,根据实际安装位置设置

#NDK=D:/adt-bundle-windows-x86_64-20131030/sdk/ndk-bundle

NDK=E:/Java/android-ndk-r16b

 

# 编译针对的平台,这里选择最低支持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 \

–enable-shared \

–disable-static \

–disable-doc \

–disable-ffmpeg \

–disable-ffplay \

–disable-ffprobe \

–disable-ffserver \

–disable-avdevice \

–disable-doc \

–disable-symver \

–cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

–target-os=linux \

–arch=arm \

–enable-cross-compile \

–sysroot=$PLATFORM \

–extra-cflags=”-I$PLATFORM/usr/include” \

 

$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

}

 

# arm v7vfp

CPU=armv7-a

OPTIMIZE_CFLAGS=”-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU ”

PREFIX=./android/$CPU-vfp

ADDITIONAL_CONFIGURE_FLAG=

build_one

不同的Ffmpeg版本和NDK版本,脚本是有差异的,最新Ffmpeg版本,网上的脚本基本编译不过的。

  1. 大概等待10分钟左右,中间或许出现一些小错误,修复一下就好,要是报大面积错误,或者是编译配置不正确。

7、生成结果

最终生成的结果如下: