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

本文介绍了如何在Android Studio中引入FFmpeg,讲解了为何需要通过Linux进行交叉编译生成.so库,详细阐述了从下载FFmpeg源码、配置NDK环境到编写shell脚本的整个过程,强调了Clang在NDK 17以后作为推荐的交叉编译工具的重要性。
摘要由CSDN通过智能技术生成

我们打开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

Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Getting help: -h -- print basic options -h long -- print more options -h full -- print all options (including all format and codec specific options, very long) See man ffmpeg for detailed description of the options. Print help / information / capabilities: -L show license -h topic show help -? topic show help -help topic show help --help topic show help -version show version -buildconf show build configuration -formats show available formats -devices show available devices -codecs show available codecs -decoders show available decoders -encoders show available encoders -bsfs show available bit stream filters -protocols show available protocols -filters show available filters -pix_fmts show available pixel formats -layouts show standard channel layouts -sample_fmts show available audio sample formats -colors show available color names -sources device list sources of the input device -sinks device list sinks of the output device Global options (affect whole program instead of just one file: -loglevel loglevel set logging level -v loglevel set logging level -report generate a report -max_alloc bytes set maximum size of a single allocated block -y overwrite output files -n never overwrite output files -stats print progress report during encoding -max_error_rate ratio of errors (0.0: no errors, 1.0: 100% error maximum error rate -bits_per_raw_sample number set the number of bits per raw sample -vol volume change audio volume (256=normal) Per-file main options: -f fmt force format -c codec codec name -codec codec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值