Bootstrap

FFmpeg 引入Android Studio,年末阿里百度等大厂技术面试题汇总

我们打开FFmpeg源码,点开文件夹发现里面所有的代码都是一些C和C++代码,成百上千个文件,如果我们将这些文件放到Android Studio来进行编译的话,那这个时候你编译一个Apk会需要相当长的时间,这就是为什么我们需要通过交叉编译去生成so然后再放到我们项目中的原因

所以我们用FFmpeg一般怎么用呢?

我们把FFmpeg的源码下载下来,然后编译到Android系统,编译成动态库或静态库,那这个编译过程就需要我们的编译环境,不能是Windows,必须要是Linux。这个Linux我们用的是CentOS 7.3,然后用Linux将源码进行编译之后产生动态库或静态库,放到我们的App当中,再通过头文件进行调用

进入FFmpeg的官网,我们可以在里面去下载源码,但是我们下载到Windows的话,是没有任何卵用的,我们必须下载到Linux

重新来到我们刚才的服务器,下载FFmpeg源码

创建一个FFmpeg,后面写到音视频直播拉流的时候,我们也是用的FFmpeg

这样我们一个FFmpeg就已经下完了,下完之后,还需要进行解压

我们调用一下解压命令xvf,然后把FFmpeg进行解压

在解压的过程中,大家就可以发现它里面有很多很多的C文件

这就是我们FFmpeg的源代码,FFmpeg的源码我们要进行编译,在Linux里面是有gcc的,那我们能不能通过Linux的gcc去编译FFmpeg呢?

很显然是不应该的,因为Linux里面的gcc和我们Android的gcc工具是不一样的。Linux它编译的东西只能在Linux使用,并不能移植到我们Android系统,这个时候我们需要学到另外一个技术——交叉编译。

目前,在NDK 17以后,它推荐的交叉工具叫做Clang,在以前的版本中,我们都是用的Android的gcc。

Android的gcc和Clang到底有什么区别呢?

为了让我们编译速度更快、执行C代码更快,就开发了一个非常便利的编译工具,就叫做Clang

后续也会通过最新的NDK版本、Clang来编译FFmpeg

那既然源码已经下下来了,接下来我们还差一个编译工具——NDK

NDK环境配置

===================================================================

因为在NDK源文件里面会有很多关于C的编译工具,我们必须用NDK的编译工具而不能用Linux的编译工具,我们把这种编译就称为交叉编译。

再回到云服务器,我们需要下载一个NDK,大家下载的时候可以选择NDKr20,我们将用这个版本去编译

然后我们还要对NDK进行环境配置

mkdir ndk 创建一个NDK目录

这里推荐大家买服务器最好是选择香港的服务器,因为香港的服器下载这些国外的软件是非常快的,比如我这台服务器的,实际上它就是一个香港服务器

然后我们使用wget命令,就可以把NDK下载下来了。NDK相对来说还是比较大的,但因为香港服务器的缘故,下载还是非常快的

下载完后,使用zip命令将下载的文件解压

unzip,解压的时间可能会有点长,根据每个服务器的配置不一样,解压的时间长短也会不一样

解压完成后我们再去配置NDK环境,这个配置环境和Windows还是有些不一样的,在Windows中我们直接在我的电脑中就可以配置到,但是在Linux里面,它是不一样的,我们需要去编辑etc/profile

在最底部加上我们的环境,我们设定一个NDK ROOT,把它加到PATH路径里面去

然后再退出,让环境生效

到目前,我们NDK的环境就已经配好了,这个时候我们需要编译FFmpeg就需要用到shell脚本

shell脚本

===================================================================

shell脚本它专门是针对于Linux里面,进行编译的语法,类似于Java语法

说到这里,shell语法我们要不要学呢?

学肯定是需要的,但我们只需要大概去了解这个shell脚本怎么去写,就已经可以满足我们这个系列文章里面所要掌握的内容

我们来看这个编写脚本里面内容,脚本的作用是将FFmpeg源码打包成我们在Android里面想要用到的.so文件,或者说.a静态库文件,供我们在Android项目里面去调用

在FFmpeg源文件夹下去建立一个android_build.sh

直接copy下面代码进去

#!/bin/bash

export NDK=/root/ndk/android-ndk-r20

当前系统

export HOST_TAG=linux-x86_64

支持的 Android CUP 架构

export ARCH=aarch64

export CPU=armv8-a

export ARCH=armv7a

export CPU=armv7-a

支持的 Android 最低系统版本

export MIN=21

export ANDROID_NDK_PLATFORM=android-21

;