我们打开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源文件里面会有很多关于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脚本它专门是针对于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