图片-稻子网
图片-稻子网
图片-稻子网
图片-稻子网

流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看

图片[1]-流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看-稻子网

很多人喜欢看直播。直播系统有哪些组成部分,使用了哪些协议?

无论是直播还是点播,其实都是视频数据的传输。说到视频,大家都爱看,但说到视频技术,大家都头疼,因为术语太多了。

三个名词系列

我在这里列出了三个名词系列,所以你可以先得到一个大致的印象。

名词系列一:AVI、MPEG、RMVB、MP4、MOV、FLV、WebM、WMV、ASF、MKV。比如RMVB和MP4,看着眼熟?名词系列二:H.261、H.262、H.263、H.264、H.265。你从来没有听说过这个吗?不用担心,您首先记得关注 H.264。名词系列三:MPEG-1、MPEG-2、MPEG-4、MPEG-7。MPEG好像听说过,但它背后的数字呢?是既熟悉又陌生?在这里,我想问你一个问题,什么是视频?我说,其实就是快速​​播放一系列连续图片。

每张图片称为一帧。只要每秒有足够的帧数,播放就足够快。比如每秒30帧,以人眼的灵敏度,是看不出这是独立画面的,也就是我们常说的帧率(FPS)。

每张图片由像素组成,假设为1024*768(这个像素数不算太多)。每个像素由 RGB 组成,每个 8 位,总共 24 位。

让我们算一下,每秒视频有多大?

30帧×1024×768×24=566,231,=70,778,

如果一分钟呢?4,246,732,已经是 4 Gs。

是不是不知道,吓了一跳?这种数据量太大而无法存储和传输。如果你这样存储,你的硬盘很快就会被填满;这么转,多少带宽都不够用!

怎么做?人们想到编码,只是为了看看如何用尽可能少的比特来保存视频,让画面在播放时仍然看起来很漂亮。编码压缩的过程。

视频和图片的压缩过程有什么特点?

视频流中的图片之所以能够被压缩,就是因为视频和图片都具有这样的特性。

空间冗余:图像的相邻像素之间存在很强的相关性。图像的相邻像素通常是渐进的,而不是突然的。不必完全保存每个像素。您可以每隔几次保存一个。中间值是使用算法计算的。时间冗余:视频序列的相邻图像之间的内容相似性。视频中连续出现的图片也不突兀,可以根据已有图片进行预测和推断。视觉冗余:人类的视觉系统对某些细节不敏感,所以它不会注意到每一个细节,这可能会导致一些数据丢失。编码冗余:不同像素值出现的概率不同,高概率使用较少字节,低概率使用较多字节,类似于霍夫曼编码的思想( )。总之,用于编码的算法非常复杂和多样,但编码过程实际上是相似的。

图片[2]-流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看-稻子网

两大视频编码流派

能否形成一定的标准?否则开发视频播放的人会筋疲力尽。当然,我在这里给大家介绍一下,视频编码的两大流派。

Genre 1:ITU(Union)的VECG(Video Group),这在ITU下被称为VCEG。既然是电信,可以想象他们最初是做视频编码的,主要是做传输的。名词系列二为本组织制定的标准。Genre 2: MPEG (Group) of ISO ( ),这是 ISO 的 MPEG,最初用于视频存储。比如在VCD和DVD中编码保存后,当然后来逐渐把重点放在了视频传输上。名词系列三是本组织制定的标准。后来,ITU-T(国际电信联盟电信标准化部门,ITU)和MPEG共同开发了H.264/MPEG-4 AVC,这就是我们本节重点介绍的内容。

编码后,生动的逐帧图像变成一串难以理解的二进制文件。二进制文件可以放在一个文件中并以某种格式保存。这是名词系列一。.

事实上,这些是视频保存为文件的格式。比如前几个字节是什么意思,后几个字节是什么意思,然后是数据,编码后的结果存放在数据中。

怎么看直播里的帅哥美女?

当然,这个二进制文件也可以通过某种网络协议封装,在互联网上传输。此时,可以进行网络直播。

网络协议将编码后的视频流从主机推送到服务器,服务器上有一个运行相同协议的服务器接收这些网络数据包,获取里面的视频流。这个过程称为流式传输。

服务器接收到视频流后,可以对视频流进行一定的处理,例如转码,即从一种编码格式转换为另一种编码格式。因为观众使用的客户端千差万别,所以确保他们都能看到直播很重要。

处理完流后,您可以等待查看器的客户端请求这些流。查看者的客户端请求的过程称为拉流。

如果有很多观众同时看一个直播视频,他们都会从一个服务器拉流,压力太大了。因此,需要一个视频分发网络将视频预加载到最近的边缘节点,以便大多数观众可以观看。视频从边缘节点拉取,可以减轻服务器的压力。

观看者的客户端拉下视频流时,需要进行解码,即通过上述过程的逆过程,将一串难以理解的二进制逐帧转换成生动的画面,在客户端播放. ,所以你可以看到漂亮和帅哥。

整个直播过程可以用这张图来描述。

图片[3]-流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看-稻子网

接下来,让我们依次看看每个过程。

编码:如何将彩色图片变成二进制流?

虽然我们说一个视频是一个图片序列,但是如果每张图片都是完整的,那就太大了,所以把视频序列分成三帧。

I 帧,也称为关键帧。里面有一张完整的图片,只需要这一帧的数据就可以完成解码。P 帧,前向预测编码帧。P 帧表示此帧与前一个关键帧(或 P 帧)之间的差异。解码时,需要使用之前缓存的图片,将差值与本帧的清晰度叠加,生成最终的图片。B帧,双向预测插值编码帧。B帧记录了本帧与前一帧的差异。解码B帧,不仅要获取之前缓存的图片,还需要获取解码后的图片,将前后图片的数据与当前帧的数据叠加得到最终的图片。可以看出I帧最完整,B帧压缩率最高,压缩帧的序列应该出现在IBBP的区间。这是通过时序编码。

图片[4]-流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看-稻子网

一帧被分成多个片,每个片被分成多个宏块,每个宏块又被分成多个子块,这样大的画面被分解成小块,可以方便空间编码。

虽然时空是非常立体的,可以形成一个序列,但还是需要压缩成二进制流。这个流是结构化的,是一个网络提取层单元(NALU,Layer Unit)。这种格式是用来传输的流媒体转发服务器,因为在网络上传输默认是一个数据包,所以一个一个地划分为单元。

图片[5]-流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看-稻子网

每个NALU首先是一个起始标识符,用来标识NALU之间的间隔;然后是NALU的,主要配置NALU的类型;最后是NALU携带的数据。

在NALU头中,主要内容是类型NAL Type。

0x07代表SPS,是一个序列参数集,包括一个图像序列的所有信息,如图像大小、视频格式等。0x08表示PPS,它是一个图像参数集,包括一个图像所有切片的所有相关信息图像流媒体转发服务器,包括图像类型、序列号等。在传输视频流之前,必须传输这两类参数,否则无法解码。为了确保容错,这两个参数集在每个 I 帧之前传递。

如果 NALU 中的表示类型是 SPS 或 PPS,则为真实参数集的内容。

如果类型是帧,那么中间是正视频数据。当然,它也一次存储一帧。前面说了,一帧还是有很多内容的,所以每个NALU都存一块。对于每一个分片,无论是I帧、P帧还是B帧,在分片结构中也有一个,它有一个类型,然后是分片的内容。

这样,整个格式就出来了。一个视频可以被分成一系列帧,每一帧又被分成一系列切片,每个切片被放置在一个NALU中,并且NALU都经过一个特殊的起始标识符,在每个切片的第一个切片前面I帧,插入分别保存SPS和PPS的NALU,最后形成一个长的NALU序列。

Push :如何将数据流打包传输到对端?

这种格式可以直接在线传输到对端,开始直播吗?事实上,现在还没有。还需要将这个二进制流打包成网络包进行传输。这里我们使用 RTMP 协议。这就进入了第二个流程,推流。

RTMP是基于TCP的,所以双方必须建立TCP连接。在TCP连接的基础上,还需要建立RTMP连接,即在程序中,需要调用RTMP类库的函数来显示连接的建立。

为什么 RTMP 需要建立单独的连接?

因为他们需要协商一些事情,以确保以后的传输能够正常进行。主要有两点,一是版本号,如果客户端和服务端的版本号不一致,就不行。另一个是时间戳。在视频播放中,时间非常重要。当后续的数据流进行通信时,往往会包含时间戳之间的差异。因此,双方必须从一开始就知道彼此的时间戳。

以后要通信这些东西,需要发送6条消息:客户端发送C0、C1、C2,服务器发送S0、S1、S2。

首先客户端发送C0表示自己的版本号,不等对方回复,然后发送C1表示自己的时间戳。

服务器收到C0后只能返回S0,表示自己的版本号。如果版本不匹配,它可以断开连接。

服务器发送 S0 后,直接发送自己的时间戳 S1,无需等待。当客户端收到 S1 时,它会发送一个知道对方时间戳的 ACK C2。同样,当服务器收到C1时,它会发送一个知道对方时间戳的ACK S2。

至此,握手完成。

图片[6]-流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看-稻子网

握手之后,双方需要互相传递一些控制信息,比如块大小、窗口大小等。

在实际传输数据的时候,还是需要创建一个流,然后通过这个推流。

推流的过程就是把NALU放进去发送,也叫RTMP包。格式是这样的。

图片[7]-流媒体转发服务器-网络协议之流媒体协议:直播中的帅哥怎么看-稻子网

发送时,去掉NALU的起始标识符。因为这部分对于 RTMP 协议是无用的。接下来,将SPS和PPS参数集封装成RTMP包发送,然后发送一片NALU。

RTMP在收发数据时不是一个单元,而是拆分成Chunk发送,只有发送完一个Chunk后,才能发送下一个Chunk。每个Chunk都有一个ID,表示它属于哪一个,接收端也会根据这个ID组装Chunk。

前面的连接中,设置的Chunk块大小是指这个Chunk。将大消息分成更小的块并发送它们可以在低带宽的情况下减少网络拥塞。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片