为什么要对视频进行编码
流媒体协议主要用于流媒体视频的直播和点播,在介绍流媒体协议之前,先给大家介绍下视频的压缩和编码机制。
说到视频播放,其实就是快速播放一系列连续的图片而已,其中的每一张图片称之为一帧,只要每秒钟帧的数量足够多,也即播放得足够快,比如每秒 30 帧,以人眼的敏感程度,就看不出这是一张张独立的图片,我们把每秒的帧数叫做帧率(FPS)。
图片是由像素构成的,每个像素由 RGB 三种颜色构成,每个颜色又由 8bit 二进制来表示,三种颜色就是 24 个 bit,假设构成视频的图片平均都是由 1024*768 像素(有时我们也将这个单位称之为分辨率)组成,这样下来,一秒钟视频的容量就是:
30*1024*768*24 bit = 566,231,040 bit = 70,778,880 Byte = 67.5 MB
相应的,一分钟视频对应的容量差不多有 4 GB,相当惊人,仅仅是一分钟啊,而且图片的分辨率并不是很高,如果是一部电视剧呢(45分钟),一部电影呢(2小时),或者同时对实时性要求很高的直播呢?这样大小的视频流目前主流的带宽根本扛不住,另外我们的磁盘空间也不够存。
但我们在网上在线看视频、直播都很顺畅啊,甚至充会员还可以看 1080p(分辨率1920*1080
) 或者 4k(分辨率3840*2160
) 的高清视频也不在话下,这又是怎么做到的呢?
这就涉及到了编码的概念,通过编码可以对视频进行压缩(想想在数据结构与算法系列中介绍的赫夫曼编码),在保证清晰度的前提下实现以尽可能少的比特数存储视频数据。
视频压缩与编码的常见标准
视频编码实现方案主要分为两个流派:
后来,ITU-T VCEG 与 ISO MPEG 联合制定了 H.264/MPEG-4(两者等价,是同一个标准,也被称作 AVC),这才是我们要重点关注的。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准,我们常见的一些视频编解码器如 AVI、MPEG、RMVB、MP4、MOV、FLV、WebM、WMV、ASF、MKV 等即是在该标准下实现的。
经过视频编码器编码之后,生动活泼的一帧帧图片,就变成了一串串让人看不懂的二进制代码,这个二进制代码可以放在一个文件里面,按照一定的格式保存起来,对应的视频格式与视频编码器一致,比如 .avi
、.flv
、.mp4
、.mov
等,然后用户需要通过相应的视频解码器才能播放这些视频,比如 AVI 解码器可以播放 .avi
格式视频,依次类推。
视频直播的实现原理
当然,这个二进制代码也可以通过某种网络协议进行封装,放在互联网上传输,这个时候就可以进行网络直播了。
首先,网络协议将编码好的视频流,从主播端推送到服务器,在服务器上有个运行了同样协议的服务端来接收这些网络包,从而得到里面的视频流,这个过程称为接流。
服务端接到视频流之后,可以对视频流进行一定的处理,例如转码,也即从一个编码格式,转成另一种格式。因为观众使用的客户端千差万别,要保证他们都能看到直播。流处理完毕之后,就可以等待观众的客户端来请求这些视频流,观众的客户端请求的过程称为拉流。
如果有非常多的观众,同时看一个视频直播,那都从一个服务器上拉流,压力太大了,因而需要一个视频的分发网络(CDN),将视频预先加载到就近的边缘节点,这样大部分观众看的视频,是从边缘节点拉取的,就能降低服务器的压力。
注:关于流媒体的 CDN 实现方案,后面学院君会单独介绍。
当观众的客户端将视频流拉下来之后,就需要进行解码,也即通过上述过程的逆过程,将一串串看不懂的二进制代码,再转变成一帧帧生动的图片,在客户端播放出来,这样你就能看到直播视频啦。
整个直播过程的流程图如下所示: