正文
说到安卓的视频开发,大多数朋友们都是用着开源的播放器,或者安卓自带的native mediaplayer,拿来主义居多,我曾经也是。。。最近这半年因为开始着手重构公司的播放器,也开始学习了很多视频音频开发的相关知识,抱着独乐乐不如众乐乐的想法,开始写一些值得分享的东西。这次的连载和之前的RxJava分享一样,会分开不容的章节。
第一次我打算分享一下视频开发中常见的一些知识点,概念和术语,给不熟悉的朋友们先"扫扫盲"。在之后的章节我会慢慢的介绍除了基本的在线视频播放技术之外,一些更加“高级”的技术 😏,包括安卓平台在4.4之后发布的全新的Codec API, 还有怎么处理自适应视频播放(Adaptive Streaming),版权管理内容(DRM Content),最后几章会使用谷歌开源的ExoPlayer作为例子,从源码的角度分析一个完整的播放器需要哪些构件。
每一个术语我都会尽量用中文写一遍,再写一遍英文,因为说实话。。。不用英文查资料,很多东西都搜不出来。
什么是Codec
什么是Container format file
视频处理的流程-从后台到前端
(华丽丽的分割线)
什么是Codec
一说到视频,音频,大家肯定都听说,至少有所耳闻这两个词 - 编码(encode) 和 解码(decode)。我这里提到的Codec就是一种程序,这种程序可以对视频文件进行编码和解码。在维基百科上对Codec是这样定义的:
A video codec is an electronic circuit or software that compresses or decompresses digital video. It converts raw (uncompressed) digital video to a compressed format or vice versa. In the context of video compression, “codec” is a concatenation of “encoder” and “decoder”—a device that only compresses is typically called an encoder, and one that only decompresses is a decoder.
那么问题来了,视频不就是视频吗,MP4,avi,rmvb,我们看的很多小电影不就是视频嘛。。。下载下来就可以看了啊。。。。为何需要编码解码。。。都是什么鬼。
…
首先,我们常说编码 就是压缩,解码 就是解压缩。视频文件的本质其实就是图片的集合而已,当一段连续的图片不断的出现在人眼前(一般一个连贯的电影或者动画至少要求一秒24帧,也就是一秒内连续出现24张图片),肉眼就会“欺骗性”的告诉大脑我们在看一个视频,而不是幻灯片。
那我们可以开始做点算术题了,假设一张像素为1280X720(清晰度,宽1280个像素点,高720个像素点)的图片,大小为约为1280X720X3 bytes,就是2.7MB。大家可以猜想一下为何我这里还需要乘以一个数字3.那么一段60秒钟的小电影,就需要60X24(24张图片)X2.7MB ,约为3.9GB了!
之所以图片大小是像素宽高相乘还要乘3 是因为一个像素点需要至少三原色(RGB)来显示像素点本身的颜色,做过安卓开发的同学都知道在xml里面定义颜色的格式吧?#ffffff - 代表白色 f是十六进制数,也就是4位二进制数,三原色需要3X4X2位二进制数,也就是3个八位,一个八位是一个字节,所以我们需要3个字节来显示一个像素点
这tm必然是不能接受的啊!这样我用我3TB的移动硬盘,也不能把苍老师的全部小电影保存起来,宝宝心里苦啊!
所以Codec这种程序就出现了,它会把这些连续的图片们通过一定的算法压缩成体积更小的文件格式,这就是我们所谓的编码,压缩。但是在播放器的客户端,不管是PC,手机也好,他们要显示在屏幕上的,必须是实实在在的图片啊,所以这些被压缩过的文件最终又必须被还原成图片格式,这就是解码,解压缩。
视频编码,压缩是一个非常复杂的过程,万幸的是,现在市面上已经有很多工具,还有现有规范来指导开发者进行编码解码了。其中最常用的一些规范是:
可能大家对压缩解压缩还是不太理解。。。到底有哪些地方可以压缩呢?那我们举个栗子!
咱们想象一下一个场景,比如说在某些电影中,主人公在安静的公园中因为失恋悲伤不已,全世界都仿佛静止一般。。。。就这么呆坐了整整30s。那么对于这种“静态的场景”,视频压缩算法会只取这三十秒的前几帧作为基准帧图片,对其余的29s的帧,采取只保存“不同的部分”的策略,这样就不用保存这些差不多相同的图片,这种做法叫“去冗余”。大大减少了视频的体积。
当然,这只是视频压缩算法的冰山一角,我们不多研究。
另外需要注意的是,Codec的编码与解码包含对视频数据的编码解码和音频数据的编码解码,因为音频的本质是声波信息,视频是图片处理,他们本质上是不同的,我这里主要是介绍视频数据的处理。
回到我们说的Codec,所以说Codec是一套程序,它遵循不同的规范,根据规范的不同提供不同的压缩解压缩策略。既然是一套规范,那么就肯定需要实现啊!在安卓平台里面,谷歌提供了视频编码解码的API,对一些基础的编码解码规范做了API的封装,在接下里的章节我会慢慢介绍,其他移动平台也都差不多,多多少少都会提供API的支持。
什么是Container format file(视频容器文件)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后
有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~
偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**