【声 明】
首先,这一系列文章均基于自己的理解和实践,可能有不对的地方,欢迎大家指正。
其次,这是一个入门系列,涉及的知识也仅限于够用,深入的知识网上也有许许多多的博文供大家学习了。
最后,写文章过程中,会借鉴参考其他人分享的文章,会在文章最后列出,感谢这些作者的分享。
码字不易,转载请注明出处!
教程代码:【Github传送门】 |
---|
目录
一、Android音视频硬解码篇:
二、使用OpenGL渲染视频画面篇
- 1,初步了解OpenGL ES
- 2,使用OpenGL渲染视频画面
- 3,OpenGL渲染多视频,实现画中画
- 4,深入了解OpenGL之EGL
- 5,OpenGL FBO数据缓冲区
- 6,Android音视频硬编码:生成一个MP4
三、Android FFmpeg音视频解码篇
- 1,FFmpeg so库编译
- 2,Android 引入FFmpeg
- 3,Android FFmpeg视频解码播放
- 4,Android FFmpeg+OpenSL ES音频解码播放
- 5,Android FFmpeg+OpenGL ES播放视频
- 6,Android FFmpeg简单合成MP4:视屏解封与重新封装
- 7,Android FFmpeg视频编码
本文你可以了解到
使用
GCC
或CLANG
交叉编译出Android平台可以使用的FFmpeg so库。为了很好的迈出FFmpeg
开发的第一步,不仅要知其然,更要知其所以然。不仅要知道怎么样能成功编译,更要知道为什么能成功编译。在开始动手之前,建议先通读整篇文章,相信本文定可以让你有所感悟。
一、前言
网上其实已经有很多的关于FFmpeg so库编译的分享,但是大部分都是直接把配置文件的内容贴出来。我想大部分取搜索 「如何编译FFmpeg so库」的人,对交叉编译这个东东都是比较陌生的。
特别对于移动端开发者来说,大部分人大多数时候都是在Java层做开发,很少接触到NDK层的东西。如果直接去看一份交叉编译的配置,估计会很上头。
通常情况下,在一篇FFmpeg编译的文章下面都会有很多的类似「为什么按照楼主的配置还是无法编译成功?」的评论,那为什么人家可以编译成功,我们copy下来却不可以呢?
原因有非常多,大部分其实集中在以下几个方面:
1. 无脑copy,祈求有一个傻瓜式的配置可以成功编译;
2. FFmpeg版本和NDK版本很多,每一个版本都可能需要不一样的配置;
3. 不了解每个配置项的意义,即使好运配置对了, 但是稍微一修改,又无法正常编译了。
为什么FFmpeg让人觉得很难搞?
我想主要是因为迈出第一步就很困难,连so库都编译不出来,后面的都是扯淡了。
二、什么是交叉编译
定义
引自百度百科的定义:交叉编译,是在一个平台上生成另一个平台上的可执行代码。
什么意思呢?说白了,就是在一个机器上生成一个程序,这个程序可以跑在另外一个机器上。举栗:在PC上编译一个apk,这个apk可以跑在Android手机上,这其实就是一个交叉编译的过程。
为什么要交叉编译
我们知道,PC上的软件是直接在PC上编译生成的,那为什么Android上的软件不能在Android上自己编译生成呢?
理论上是可以,但是Android手机上的资源有限啊,在PC上编译一个apk都要那么久,你可以想象在Android手机上编译一个apk要多久吗?或者你能想象在手机上敲代码的情景吗?
那我们会想既然PC上资源那么丰富,那可不可以利用PC来编译出在手机上可以运行的软件呢?
于是,交叉编译出现。
交叉编译需要的什么
编译环境
我们知道PC上的环境和手机上的运行环境是绝然不同的,如果使用PC上的环境直接编译的话,可以想象这个编译出来的App,分分钟就会挂掉。
所以,交叉编译最重要的是,要配置好编译过程中使用到的相关的环境,而这个环境其实就是目标机器(比如Android手机)正在运行的环境。
编译工具链
对于C/C++的编译,通常有两个工具 GCC
和 CLANG
。
GCC
可能大家都有听说过,这是一个老牌的编译工具,不仅可以编译C/C++,也可以编译Java,Object-C,Go等语言。
CLANG
则是一个效率更高的C/C++编译工具,并且兼容GCC,Google在很早以前就开始建议使用clang进行编译,并且在 ndk 17
以后,把 GCC
移除了,全面推行使用 CLANG
。
三、如何交叉编译FFmpeg
FFmpeg是什么
鼎鼎大名的FFmpeg,不说在音视频界如雷贯耳,就算一个不开发音视频的开发者也都是略有耳闻。
官方简介
A complete, cross-platform solution to record, convert and stream audio and video.
翻译过来就是:FFmpeg是一套集录制、转换以及流化音视频的完整的跨平台解决方案。
从这段简介可以看到FFmpeg有以下特点:
- 功能强大:录制、解码、编码、编辑、推流等等
- 跨平台
编译流程
从前面的介绍,基本上可以总结出FFmepg编译的基本流程:
- 选择编译工具