直播视频处理过程

2023-09-16 22:50:30

视频其实就是快速播放一连串连续的图片。

每一张图片,我们称为一帧。只要每秒钟帧的数据足够多,也即播放得足够快。比如每秒 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)的思路。

流派一:ITU(International Telecommunications Union)的 VCEG(Video Coding Experts Group),这个称为国际电联下的 VCEG。既然是电信,可想而知,他们最初做视频编码,主要侧重传输。

流派二:ISO(International Standards Organization)的 MPEG(Moving 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 的 Type=0,表示 Chunk 头是完整的;头里面 Timestamp 为 1000,总长度 Length 为 307,类型为 9,是个视频,Stream  ID 为 12346,正文部分承担 128 个字节的 Data。

第二个 Chunk 也要发送 128 个字节,Chunk 头由于和第一个 Chunk 一样,因此采用 Chunk Type=3,表示头一样就不再发送了。

第三个 Chunk 要发送的 Data 的长度为 307-128-128=51 个字节,还是采用 Type=3。

就这样数据就源源不断到达流媒体服务器,整个过程就像这样。

分发网络分为中心和边缘两层。边缘层服务器部署在全国各地及横跨各大运营商里,和用户距离很近。中心层是流媒体服务集群,负责内容的转发。智能负载均衡系统,根据用户的地理位置信息,就近选择边缘服务器,为用户提供推 / 拉流服务。中心层也负责转码服务,例如,把 RTMP 协议的码流转换为 HLS 码流。

观众的客户端通过 RTMP 拉流的过程。

先读到的是 H.264 的解码参数,例如 SPS 和 PPS,然后对收到的 NALU 组成的一个个帧,进行解码,交给播发器播放,一个绚丽多彩的视频画面就出来了。

此文章为9月Day16学习笔记,内容来源于极客时间《趣谈网络协议》,推荐该课程。

更多推荐

计算机丢失mfc140u.dll怎么办,mfc140u.dll丢失的解决方法分享

随着科技的飞速发展,计算机已经成为了人们日常生活和工作中不可或缺的工具。然而,在使用计算机的过程中,用户可能会遇到各种问题,其中计算机丢失mfc140u.dll无法运行的问题就是一个比较常见的困扰。小编将从以下几个方面对这个问题进行详细的探讨。一、mfc140u.dll文件的作用Mfc140u.dll是Microsof

linux相关知识以及有关指令3

在linux的世界中我们首先要有万物皆文件的概念,那么在系统中有那么多的文件,我们该怎么区分呢?文章目录1.文件分类2.文件的权限1).拥有者和所属组以及other2).文件的权限3).粘滞位4).对于权限修改的拓展知识点a.修改权限b.修改拥有者所属组c.权限掩码1.文件分类在linux中文件大致分为以下几类:-:普

windows安装npm教程及生成DEMO

在使用之前,先类掌握3个东西,明白它们是用来干什么的:npm:nodejs下的包管理器。webpack:它主要用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源作相应的准备,比如资源的合并和打包。vue-cli:用户生成Vue工程模板。(帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的

这个世界,永远靠实力说话

这个世界,永远靠实力说话。与其寄望于运气或机会的降临,还不如脚踏实地,努力提升自己。因为只有强者,才能在这个充满挑战和机遇的世界里谈笑风生,创造出属于自己的成功和辉煌。就比如峰民dyfm888给人取名改名,有时候,峰民愿意给从没见过面的福主改名。有人不禁会问:“那别人远在千里,如何信任你?面都没见到,又如何相信你,给你

冯诺依曼体系结构+操作系统

目录一、冯诺依曼体系结构(一)基本结构(二)举例二、操作系统(一)概念(二)设计OS的目的(三)定位(四)内存管理、驱动管理、进程管理和文件管理1.内存管理2.驱动管理3.进程管理4.文件管理三、整体结构1.操作系统——驱动程序——底层硬件2.systemcall——操作系统3.用户——用户操作接口一、冯诺依曼体系结构

主机安全技术

主机安全1、主机分类类Unix主机Unix:Solaris,AIXLiunx:Redhat,Centos,SUSE等Windows主机Windowsserver2012,server2008等特殊主机IBMiseris,大型机等等2、主机风险操作系统风险0day漏洞,操作系统漏洞,黑客可以利用漏洞控制服务器或者发动拒绝

echarts常用参数详解汇总(饼图,柱形图,折线图)持续更新中

常用配置:X/Y轴线的基础设置《通用》细微的差距只能去官网查看了,基本一致这里只是做了个汇总方便查看xAxis/yAxis:{show:false,//不显示坐标轴线、坐标轴刻度线和坐标轴上的文字axisTick:{----------------------------------------------------

数据结构之拓扑排序

目录拓扑排序思想代码实现拓扑排序相关数据结构拓扑排序思想拓扑排序的思想是通过对有向无环图(DAG)进行排序,将图中的节点按照一定的拓扑顺序进行排列。拓扑排序的基本思想是,首先找到入度为0的节点,将其加入结果序列中,并将其从图中删除。然后,更新剩余节点的入度,继续找到新的入度为0的节点,重复上述过程,直到所有节点都被加入

PostgreSQL 命令行工具介绍

文章目录前言1.连接数据库1.1psql本地连接1.2psql远程连接1.3指定客户端字符集2.pg_ctl管理命令2.1初始化数据库2.2启动数据库2.3加载配置文件2.4查看数据库状态3.数据库信息查看3.1查看数据库版本3.2查看数据库的启动时间3.3查看配置文件load时间3.4查看当前连接用户3.5查看修改参

道可云元宇宙每日资讯|首届报业传媒元宇宙应用大会在青岛开幕

道可云元宇宙每日简报(2023年9月22日)讯,今日元宇宙新鲜事有:元宇宙与人工智能时代的出版与阅读研讨会举行由中国新闻出版研究院元宇宙出版与阅读实验室、北京印刷学院数字出版前沿技术应用创新联合实验室主办的元宇宙与人工智能时代的出版与阅读研讨会今天在敦煌举行。与会嘉宾围绕通用人工智能在出版行业应用现状与发展方向、元宇宙

思腾云计算

思腾合力(SITONHOLY)是AI服务器与HPC基础架构解决方案商,作为NVIDIA精英级别的合作伙伴,一直专注于人工智能领域。思腾合力拥有自主品牌GPU服务器及通用X86服务器,适用于深度学习训练及推理等场景,覆盖服务器、静音工作站等多种产品形态。在人工智能硬件领域深耕的同时,也在软件领域不断探索发展,独立开发的S

热文推荐