Ubuntu 16.04下交叉编译android Ffmpeg库,支持neon加速和硬解码。

环境

1.Ubuntu 16.04(windows上安装的虚拟机)

2.NDK版本,android-ndk-r14b

下载Ffmpeg源码

这里提供ffmpeg官网下载地址 http://ffmpeg.org/download.html。可以直接下载压缩包解压或者直接用git下载,我目前下载的是ffmpeg3.4版本。

git下载命令为:git clone https://git.ffmpeg.org/ffmpeg.git

下载NDK

下载地址:https://developer.android.google.cn/ndk/downloads/older_releases.html,我们下载linux的版本。我这里使用的是ndk-r14b的版本。

这里有个小提示,注意查看NDK 目录如:android-ndk-r14b/platforms/android-21/arch-arm/usr/include文件夹下面是否有相关头文件,如图所示是正常的。我之前用ndk-r16的版本编译怎么都编译不过,后来才发现include文件夹里面是空的(不知道为什么为导致这个问题,ndk版本都是从官网下的,有可能是版本的差异吧,比较了解的同学可以私聊我帮忙解答一下)。

Ubuntu 16.04下交叉编译android Ffmpeg库,支持neon加速和硬解码。_第1张图片

创建编译脚本

在下载好的ffmpeg目录下建立脚本文件 build_android.sh文件,目录截图如下
Ubuntu 16.04下交叉编译android Ffmpeg库,支持neon加速和硬解码。_第2张图片

正常编译ffmpeg需要先运行configure然后再使用make指令,这里熟悉linux的同学应该比较好理解,我们为了简单,直接写编译脚本一步搞定。

build_android.sh文件内容如下:

#!/bin/bash
echo "进入编译ffmpeg脚本"

#指定NDK目录
NDK=/root/ff/android-ndk-r14b
#5.0
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CPU=armv7-a
#输出路径
PREFIX=./android/$CPU
function buildFF
{
    echo "开始编译ffmpeg"
    ./configure \
    --prefix=$PREFIX \
    --target-os=android \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --arch=arm \
    --cpu=$CPU  \
    --sysroot=$PLATFORM \
    --extra-cflags="$CFLAG" \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
    --enable-shared \
    --enable-runtime-cpudetect \
    --enable-gpl \
    --enable-small \
    --enable-cross-compile \
    --disable-debug \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    --disable-postproc \
    --disable-avdevice \
    --disable-symver \
    --disable-stripping \
    $ADD 
    make -j8
    make install
    echo "编译结束!"
}
###########################################################
echo "编译支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/armv7-a-neon-hard
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "
ADD="--enable-asm \
    --enable-neon \
    --enable-jni \
    --enable-mediacodec \
    --enable-decoder=h264_mediacodec \
    --enable-hwaccel=h264_mediacodec \
    --enable-decoder=hevc_mediacodec \
    --enable-decoder=mpeg4_mediacodec \
    --enable-decoder=vp8_mediacodec \
    --enable-decoder=vp9_mediacodec"
buildFF

###########################################################
echo "编译不支持neon和硬解码"
CPU=armv7-a
PREFIX=./android/$CPU
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "
ADD=
buildFF

脚本很简单,先指定NDK目录,这里需要用你系统的ndk路径,然后我们指定android版本21及以上,在$NDK/platforms/目录下可以选择指定的android版本。然后就是运行配置文件 configure,由于我的脚本和configure是在同目录所以指定路径为./configure。编译时需要指定你自己的目录。然后就是一些编译指令,注意$ADD参数,我们将支持neon加速和硬解码的库和不支持neon和硬解码的库分别编译(大家运行时也可以比对两个库的时间损耗)。其中“h264_mediacodec”是h264硬解,“hevc_mediacodec”是H265硬解,“mpeg4_mediacodec”是mpeg格式硬解。

开始编译

脚本编译完成,然后直接运行就OK了,输入命令:

./build_android.sh

控制台就会输出“进入编译ffmpeg脚本”字样,然后等待提示“编译结束!”就OK了。

PREFIX 参数指定输出目录,

如脚本所示:PREFIX=./android/armv7-a-neon-hard为支持neon和硬解码的库

CPU=armv7-a
PREFIX=./android/$CPU为不支持neon和硬解码的库。

到这一步,我们的编译就正式完成了。

如图所示:

其中include为头文件,lib就是我们编译好的so。如果是支持neon加速的 上图目录就是**/android/armv7-a-neon-hard。

是不是很简单,到此编译完成,我们就可以用JNI写我们的ffmpeg编解码了。

这里有一个使用ffmpeg硬解码rtsp视频流和openGL渲染的文章,大家感兴趣可以移步https://blog.csdn.net/u011866128/article/details/89024273

 

你可能感兴趣的:(ffmpeg)