视频是快速播放一连串连续的图片。
视频中的图片压缩:
视频编码的两大流派
- ITU(International Telecommunications Union)的VCEG(Video Codding Experts Group)。侧重传输。
- ISO(International Standards Organization)的MPEG(Moving Picture Experts Group)。侧重存储。
后来,ITU-T(ITU Telecommunication Standardization Sector)与MPEG联合制定了H.264/MPEG-4 AVC。
经过编码后 ,图像便成为二进制。
如何在直播里看到帅哥美女?
- 网络协议将编码好的视频流,从主播段推送到服务器,服务器上有运行同样协议的服务端接收网络包,得到视频流,该过程为接流。
- 服务端接流后,可对视频流进行处理,如转码。
- 服务端处理完流后,观众的客户端请求流,该过程为拉流。
- 为降低服务器压力,需要一个视频分发网络,将视频预先加载到就近的边缘节点。
- 客户端拉流后,进行解码,将二进制转为图片,播放。
过程详解
1、编码:如何将丰富多彩的图片变成二进制流?
视频序列分3种帧:
- I 帧,也称关键帧。里面是完整的图片,只需要本帧数据,就可以完成解码。
- P帧,前向预测编码帧。记录此帧与前一帧的差别,解码需要之前缓存的画面。
- B帧,双向预测内插编码帧。记录本帧与前后两帧的差别。
压缩后帧的序列,应该是在 IBBP 的间隔出现的。
一个帧分成多个片,片分成多个宏块,宏分成多个子块,方便进行空间上的编码。
编码后,需压缩成流,是一个个的网络提取层单元(NALU,Network Abstraction Layer Unit),方便网络上的传输,因为网络传输默认是包。
NALU起始标识符标识NALU之间的间隔;NALU头里配置了类型;Payload里是承载的数据。
NALU头里,主要的内容是类型NAL Type。
- 0x07 表示 SPS,序列参数集,包括图像序列的所有信息,如图像尺寸、视频格式等。
- 0x08 表示 PPS,图像参数集,包括图像的所有分片的相关信息,如图像类型、序列号等。
传输视频流之前,先传输这两类参数,用于解密。为保证容错性,每个 I 帧前都会传输两类参数。
如果NALU Header里表示的类型是SPS或PPS,则Payload里就是真正参数集的内容;如果类型是帧,则Payload里是真正的视频数据。保存的是帧里的一片,每片是I帧还是P帧,在片结构里的Header里的类型说明,然后是片的内容。
2、推流:如何把数据流打包传输到对端?
使用RTMP协议。RTMP基于TCP,双方需要建立一个TCP的连接。
RTMP为什么需要建立一个单独的连接?因为需要商量一些事情,保证之后传输的正常进行。主要商量版本号和时间戳。握手之后,双方传递一些控制信息,如Chunk块的大小 、窗口大小等。
真正传输数据的时候,还需要创建一个流Stream,然后通过Stream推流publish。
推流的过程,就是将NALU放在Message里传送,称RTMP packet包。Message的格式如下图所示。
发送时,去掉NALU的起始标识符。将SPS和PPS参数集封装称一个RTMP包发送,然后发送一个个片的NALU。
RTMP收发数据时,将Message拆分成Chunk发送,每个Chunk中带Message ID。
推流过程如下图所示:
3、为降低服务器压力,需要有分发网络。
分发网络分为中心和边缘两层。边缘层离用户比较近。中心层时流媒体服务集群,负责内容的转发、转码。智能负载均衡系统,根据用户的地理位置信息,就近选择边缘服务器,为用户提供推/拉流服务。
4、拉流:观众的客户端如何看到视频?
客户端通过RTMP拉流过程如下图所示:
先读到的是H.264的解码参数,如SPS和PPS,然后对收到的NALU组成一个个帧,进行解码,交给播放器播放。