计算机网络协议系列 - 流媒体协议篇:视频编码与直播的实现原理介绍

- 1 min

计算机网络协议系列(五十七)

为什么要对视频进行编码

流媒体协议主要用于流媒体视频的直播和点播,在介绍流媒体协议之前,先给大家介绍下视频的压缩和编码机制。

说到视频播放,其实就是快速播放一系列连续的图片而已,其中的每一张图片称之为一帧,只要每秒钟帧的数量足够多,也即播放得足够快,比如每秒 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) 的高清视频也不在话下,这又是怎么做到的呢?

这就涉及到了编码的概念,通过编码可以对视频进行压缩(想想在数据结构与算法系列中介绍的赫夫曼编码),在保证清晰度的前提下实现以尽可能少的比特数存储视频数据。

视频压缩与编码的常见标准

视频编码实现方案主要分为两个流派:

  1. 国际电信联盟电信标准化部门(简称 ITU-T)旗下的 VCEG(Video Coding Experts Group,视频编码专家组),因为是电信联盟,所以他们最初做视频编码主要侧重传输,这个编码组制定的视频通信协议包括 H.261、 H.262、H.263、H.264、H.265 等;
  2. 国际标准组织(简称 ISO)旗下的 MPEG(Moving Picture Experts Group,动态图像专家组),他们本来是做视频存储的,例如将编码后的视频保存在 VCD 和 DVD 中,随着 VCD 和 DVD 的消逝,后来也慢慢侧重视频传输了,这个编码组制定了的视频编码标准包括 MPEG-1、MPEG-2、MPEG-4、MPEG-7 等。

后来,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 实现方案,后面学院君会单独介绍。

当观众的客户端将视频流拉下来之后,就需要进行解码,也即通过上述过程的逆过程,将一串串看不懂的二进制代码,再转变成一帧帧生动的图片,在客户端播放出来,这样你就能看到直播视频啦。

整个直播过程的流程图如下所示:

img

rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora