ffmpeg编译android,Windows上实现FFmpeg编译Android版【音视频】

首先说明一下工具预备:

Windows10 64位(其他Windows版本也是一样)

MinGW 64位,当然是用Cygwin也是一样,这里是用的是MinGW。

FFmpeg4,这里是用4.1版本。

关于FFmpeg的下载,可以去官网进行下载,也可以直接使用git命令下载。

git clone https://git.ffmpeg.org/ffmpeg.git

在编译之前大家要明白NDK的一个重大变更:NDK放弃GCC,全面转向Clang。

在新版本NDK中将会采用Clang进行编译,当然文章的最后也会介绍低版本NDK(支持GCC)编译脚本。

另外针对不同的FFmpeg版本也得使用不能版本的NDK,否则将无法编译通过。

所以对于不同版本的FFmpeg所需要书写的脚本也是不同的。

一、NDK r21b编译FFmpeg4。

首先在下载好的ffmpeg目录下创建一个脚本文件:build_android.sh

在该脚本文件中输入以下内容:

#!/bin/bash

# 临时文件路径

export TMPDIR=`dirname $0`/tmpdir

# NDK路径

NDK=E:/Android_Studio/android-sdk/ndk-bundle

# API版本(Android API)

API=19

# arm aarch64 i686 x86_64,所属系统

ARCH=arm

# 编译针对的平台,可以根据自己的需求进行设置

# armv7a aarch64 i686 x86_64

PLATFORM=armv7a

TARGET=$PLATFORM-linux-androideabi

# 工具链的路径,根据编译的平台不同而不同

TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/windows-x86_64/bin

SYSROOT=$NDK/sysroot

# 编译文件输出路径

PREFIX=`dirname $0`/android_arm/$PLATFORM

CFLAG="-D__ANDROID_API__=$API -U_FILE_OFFSET_BITS -DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD -Os -fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm"

mkdir -p $TMPDIR

build_one()

{

./configure \

--ln_s="cp -rf" \

--prefix=$PREFIX \

--cc=$TOOLCHAIN/$TARGET$API-clang \

--cxx=$TOOLCHAIN/$TARGET$API-clang++ \

--ld=$TOOLCHAIN/$TARGET$API-clang \

--target-os=android \

--arch=$ARCH \

--cpu=$PLATFORM \

--cross-prefix=$TOOLCHAIN/$ARCH-linux-androideabi- \

--disable-asm \

--enable-cross-compile \

--enable-shared \

--disable-static \

--enable-runtime-cpudetect \

--disable-doc \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-doc \

--disable-symver \

--enable-small \

--enable-gpl --enable-nonfree --enable-version3 --disable-iconv \

--enable-jni \

--enable-mediacodec \

--disable-decoders --enable-decoder=vp9 --enable-decoder=h264 --enable-decoder=mpeg4 --enable-decoder=aac \

--disable-encoders --enable-encoder=vp9_vaapi --enable-encoder=h264_nvenc --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc \

--disable-demuxers --enable-demuxer=rtsp --enable-demuxer=rtp --enable-demuxer=flv --enable-demuxer=h264 \

--disable-muxers --enable-muxer=rtsp --enable-muxer=rtp --enable-muxer=flv --enable-muxer=h264 \

--disable-parsers --enable-parser=mpeg4video --enable-parser=aac --enable-parser=h264 --enable-parser=vp9 \

--disable-protocols --enable-protocol=rtmp --enable-protocol=rtp --enable-protocol=tcp --enable-protocol=udp \

--disable-bsfs \

--disable-indevs --enable-indev=v4l2 \

--disable-outdevs \

--disable-filters \

--disable-postproc \

--extra-cflags="$CFLAG" \

--extra-ldflags="-marm"

}

build_one

make clean

make -j4

make install

主要注意的是上述NDK路径要是真实路径。

最后运行MinGW(即E:\FFmpeg\MinGW\msys\1.0\msys.bat文件)进行编译。

双击msys.bat文件,弹出一个弹框,在弹框中输入要编辑的ffmpeg路径,之后运行build_android.sh脚本,如下图所示:

c119441dcf8358775dd828bc294daec4.png

如果该文件没有权限,可以先增加权限,再执行脚本文件:

chmod a+x ./build_android.sh

等待一段编译过程,直至编译完成。

1b47bb72d7b323f38a2e61f29966feb2.png

最后在build_android.sh设置的输出目录,可以找到我们需要的so文件,如下图所示:

13d0536ce97409b4ab46807066efecf2.png

编译FFmpeg4到这儿算是全部完成了,那么如果利用NDK编译FFmpeg3呢?

二、NDK编译FFmpeg3。

对于FFmpeg3的编译,需要借助于低版本NDK(支持GCC)进行编译。

我这里提供两款64位NDK:

链接: https://pan.baidu.com/s/17BrGFAjjEz_EJ5c6Q8arcQ 提取码: h1jq

同样需要在ffmpeg目录下创建脚本文件:build_android.sh(名称可以自定义),然后写入一下内容。

#!/bin/bash

#这句很重要,不然会报错 unable to create temporary file in

export TMPDIR=E:/FFmpeg/ffmpeg-3.3.9/ffmpegtemp

# NDK的路径,根据自己的安装位置进行设置

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

# 编译针对的平台,可以根据自己的需求进行设置

# 这里选择最低支持android-14, arm架构,生成的so库是放在

# libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86

PLATFORM=$NDK/platforms/android-21/arch-arm

# 工具链的路径,根据编译的平台不同而不同

# arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号,

# 根据自己安装的NDK版本来确定,一般使用最新的版本

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

function build_one

{

./configure \

--prefix=$PREFIX \

--target-os=android \

--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

# ---- 合成 libffmpeg.so Start--------

$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

# ---- 合成 libffmpeg.so End--------

}

# arm v7vfp

CPU=armv7-a

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

PREFIX=./android/$CPU-vfp

ADDITIONAL_CONFIGURE_FLAG=

build_one

注意 :上面合成的地方是把生成的六个文件(libavcodec-57.so, libavfilter-6.so, libavformat-57.so, libavutil-55.so, libswresample-2, libswscale-4.so)合成 libffmpeg.so文件 , 如若不想合成可以把该地方删掉,并把--disable-shared和--enable-static改为enable-shared和disable-static。

同样运行MinGW进行编译,最终在ffmpeg文件夹下生成android文件,而android文件里面的内容就是我们所需要的相关内容,lib、share、include。

最后提供一下编译好的github地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值