有做义工的相亲网站吗,用啥网站做首页,肥城移动网站制作,网站备案号 主体备案号视频其实就是快速播放一连串连续的图片。
每一张图片#xff0c;我们称为一帧。只要每秒钟帧的数据足够多#xff0c;也即播放得足够快。比如每秒 30 帧#xff0c;以人的眼睛的敏感程度#xff0c;是看不出这是一张张独立的图片的#xff0c;这就是我们常说的帧率#…视频其实就是快速播放一连串连续的图片。
每一张图片我们称为一帧。只要每秒钟帧的数据足够多也即播放得足够快。比如每秒 30 帧以人的眼睛的敏感程度是看不出这是一张张独立的图片的这就是我们常说的帧率FPS。
每一张图片都是由像素组成的假设为 1024*768这个像素数不算多。每个像素由 RGB 组成每个 8 位共 24 位。
30 帧 × 1024 × 768 × 24 566,231,040Bits 70,778,880Bytes。如果一分钟呢4,246,732,800Bytes已经是 4 个 G 了。
之所以能够对视频流中的图片进行压缩因为视频和图片有这样一些特点。
空间冗余图像的相邻像素之间有较强的相关性一张图片相邻像素往往是渐变的不是突变的没必要每个像素都完整地保存可以隔几个保存一个中间的用算法计算出来。时间冗余视频序列的相邻图像之间内容相似。一个视频中连续出现的图片也不是突变的可以根据已有的图片进行预测和推断。视觉冗余人的视觉系统对某些细节不敏感因此不会每一个细节都注意到可以允许丢失一些数据。编码冗余不同像素值出现的概率不同概率高的用的字节少概率低的用的字节多类似霍夫曼编码Huffman Coding的思路。
流派一ITUInternational Telecommunications Union的 VCEGVideo Coding Experts Group这个称为国际电联下的 VCEG。既然是电信可想而知他们最初做视频编码主要侧重传输。
流派二ISOInternational Standards Organization的 MPEGMoving Picture Experts Group这个是 ISO 旗下的 MPEG本来是做视频存储的。例如编码后保存在 VCD 和 DVD 中。
网络协议将编码好的视频流从主播端推送到服务器在服务器上有个运行了同样协议的服务端来接收这些网络包从而得到里面的视频流这个过程称为接流。
服务端接到视频流之后可以对视频流进行一定的处理例如转码也即从一个编码格式转成另一种格式。因为观众使用的客户端千差万别要保证他们都能看到直播。
流处理完毕之后就可以等待观众的客户端来请求这些视频流。观众的客户端请求的过程称为拉流。
如果有非常多的观众同时看一个视频直播那都从一个服务器上拉流压力太大了因而需要一个视频的分发网络将视频预先加载到就近的边缘节点这样大部分观众看的视频是从边缘节点拉取的就能降低服务器的压力。
当观众的客户端将视频流拉下来之后就需要进行解码也即通过上述过程的逆过程将一串串看不懂的二进制再转变成一帧帧生动的图片在客户端播放出来这样你就能看到美女帅哥啦。
整个直播过程可以用这个的图来描述。 I 帧也称关键帧。里面是完整的图片只需要本帧数据就可以完成解码。P 帧前向预测编码帧。P 帧表示的是这一帧跟之前的一个关键帧或 P 帧的差别解码时需要用之前缓存的画面叠加上和本帧定义的差别生成最终画面。B 帧双向预测内插编码帧。B 帧记录的是本帧与前后帧的差别。要解码 B 帧不仅要取得之前的缓存画面还要解码之后的画面通过前后画面的数据与本帧数据的叠加取得最终的画面。
可以看出I 帧最完整B 帧压缩率最高而压缩后帧的序列应该是在 IBBP 的间隔出现的。这就是通过时序进行编码。
一个视频可以拆分成一系列的帧每一帧拆分成一系列的片每一片都放在一个 NALU 里面NALU 之间都是通过特殊的起始标识符分隔在每一个 I 帧的第一片前面要插入单独保存 SPS 和 PPS 的 NALU最终形成一个长长的 NALU 序列。
RTMP 是基于 TCP 的因而肯定需要双方建立一个 TCP 的连接。在有 TCP 的连接的基础上还需要建立一个 RTMP 的连接也即在程序里面你需要调用 RTMP 类库的 Connect 函数显示创建一个连接。
主要就是两个事情一个是版本号如果客户端、服务器的版本号不一致则不能工作。另一个就是时间戳视频播放中时间是很重要的后面的数据流互通的时候经常要带上时间戳的差值因而一开始双方就要知道对方的时间戳。 推流的过程就是将 NALU 放在 Message 里面发送这个也称为 RTMP Packet 包。Message 的格式就像这样。 RTMP 在收发数据的时候并不是以 Message 为单位的而是把 Message 拆分成 Chunk 发送而且必须在一个 Chunk 发送完成之后才能开始发送下一个 Chunk。每个 Chunk 中都带有 Message ID表示属于哪个 Message接收端也会按照这个 ID 将 Chunk 组装成 Message。
假设一个视频的消息长度为 307但是 Chunk 大小约定为 128于是会拆分为三个 Chunk。
第一个 Chunk 的 Type0表示 Chunk 头是完整的头里面 Timestamp 为 1000总长度 Length 为 307类型为 9是个视频Stream ID 为 12346正文部分承担 128 个字节的 Data。
第二个 Chunk 也要发送 128 个字节Chunk 头由于和第一个 Chunk 一样因此采用 Chunk Type3表示头一样就不再发送了。
第三个 Chunk 要发送的 Data 的长度为 307-128-12851 个字节还是采用 Type3。 就这样数据就源源不断到达流媒体服务器整个过程就像这样。
分发网络分为中心和边缘两层。边缘层服务器部署在全国各地及横跨各大运营商里和用户距离很近。中心层是流媒体服务集群负责内容的转发。智能负载均衡系统根据用户的地理位置信息就近选择边缘服务器为用户提供推 / 拉流服务。中心层也负责转码服务例如把 RTMP 协议的码流转换为 HLS 码流。 观众的客户端通过 RTMP 拉流的过程。 先读到的是 H.264 的解码参数例如 SPS 和 PPS然后对收到的 NALU 组成的一个个帧进行解码交给播发器播放一个绚丽多彩的视频画面就出来了。 此文章为9月Day16学习笔记内容来源于极客时间《趣谈网络协议》推荐该课程。