这是我参与「第四届青训营」笔记创作活动的第6天
课程主要内容
-
视频的基本元素
- 分辨率
- 帧率
- 码率
- 视频轨道
-
视频压缩
- I、P、B 帧的特点
- GOP 的概念
- H264、H265 编码的特点
-
直播推拉流协议
- 对比不同视频场景的技术方案选取
- 对比 FLV 和 MP4 的封装特点
- 介绍 RTMP / HTTP-FLV / HLS 的特点和选择
-
客户端工作及总结
- 开播:图像采集、图像处理、编码、推流
- 看播:拉流、解码、图像处理、渲染
视频的基本元素
像素
像素:是指在由一个数字序列表示的图像中的一个最小单位,称为像素,通常表现为一个小方格。每个像素有自己的颜色值,一般为RGB 三原色来表示。
RGB 三原色
RGB 三原色:每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度。记录及显示彩色图像时,RGB是最常见的一种方案。
它们的取值,R、G、B分别从0到255,一共256个等级。
分辨率
分辨率:指的是纵横方向的像素数量,一般表示为:宽 * 高( or 长 * 宽 ),720*1080等。
码率 / 比特率
码率/比特率:表示单位时间内传送 bit的数目,单位bps,表示是单位时间播放连续的媒体如压缩后的音视频的bit数量,也称为码流。
越高的比特率,需要更高的带宽来支撑,否则会带来卡顿、成本等问题;太低的比特率,可能会导致视频画面过度压缩,模糊不清。
帧 & 帧率
帧(Frame):理解帧就是视频或者动画中的每一张画面,而视频和动画特效就是由无数张画面组合而成,每一张画面都是一帧。
FPS 也可以理解为我们常说的"刷新率"。
帧率 (Frame Rate):每秒传输帧数通俗来讲就是指动画或视频的画面数、帧率。每秒钟帧数越多,所显示的动作就会越流畅。
视频数据的封装
封装:就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。
目前主要的视频容器有如下: MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。
视频压缩
视频播放的本质:将视频画面从封装文件中进行解码、渲染
颜色空间:YUV就是另外一种颜色数字化表示方式。视频通信系统之所以要采用YUV,而不是RGB,主要是因为RGB信号不利于压缩。在YUV这种方式里面,加入了亮度这一概念。
YUV里面的“Y”,就是亮度(Luma),"U"和"V"则是色度(Chroma)。
YUV420能为我们节省1/2的数据量。
压缩:利用视频画面的相关性减少数据量。
帧内压缩 / 空间压缩
帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。
帧间压缩 / 时间压缩
帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的。
I-frame:Intra-frame 帧内帧,只进行帧内预测,自身能独立完成帧内编码解码。压缩率小。
P-frame:Predicted Frame 前向预测帧,可以进行帧间预测和内预测帧,压缩率比I帧高。必须要参考帧能够正确编解码
B-frame:Bi-Directional frame 双向预测帧,可以进行帧间预测和帧内预测,压缩率最好。需要缓存帧,延时高。RTC场景不适合。
由于B帧可以参考和插入在它之前和之后发生的两个(或更多)帧(在时间维度上),所以它可以显著降低帧的大小,同时保持视频质量。B帧能够利用空间冗余和时间冗余(未来的帧和过去的帧),这使得它在视频压缩中非常有用。
直播推拉流协议
CDN:Content Delivery Network
建立并覆盖在Internet 之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。通过智能调度将用户请求到最接近用户的服务节点,降低用户访问延迟,提升可用性。
边缘节点:指在靠近用户的网络边缘侧构建的业务平台,提供存储、计算、网络等资源,将部分关键业务应用下沉到接入网络边缘,以减少网络传输和多级转发带来的宽度和时延损耗。
名词解释
点播:视频播放
直播看播:观众观看直播
推流:主播将数据发送到CDN网络
拉流:观众从CDN拉取直播数据
封装格式:
是指按照一定的规则,将视频数据、音频数据等,放到一个文件中。 常见的MKV、AVI以及本文介绍的MP4等,都是封装格式。
MP4
Moov:Movie Box,存储 mp4 的 metadata,一般位于mp4文件的开头。
mvhd:Movie Header Box,mp4文件的整体信息,比如创建时间、文件时长等。
trak:Track Box,一个mp4可以包含一个或多个轨道(比如视频轨道、音频轨道)。
Stbl:Sample Table Box,包含了这些媒体数据的索引以及时间信息
FLV
FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。
tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)。
推拉流协议
RTMP、HTTP-FLV、HLS
推流协议
推流协议也称实时消息协议(Real-Time Messaging Protoco, 缩写RTMP),是最初由Macromedia为通过互联网Flash播放器与一个服务器之间传输流媒体音频、视频和数据而开发的一个专有协议后被 Adobe公司收购。
优势:
- 基于 tcp 协议
- 技术成熟,Ffmpeg 项目中有 rtmp 库
- 低延迟
劣势:
- 停止更新
- 规范上没有支持 H265
- 使用 1935 端口,会被防火墙阻碍
拉流协议
- HTTP-FLV
Flash Video(简称FLV),是一种网络视频格式,用作流媒体格式。
协议友好,格式简单,便于分发。不转码的情况下直接转发即可,延迟较低。
- HTTP Live Streaming
缩写为HLS是由苹果公司提出基于HTTP的流媒体网络传输协议。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。
各方案对比
客户端工作及总结
推流端
开播过程: 图像采集 ——> 图像处理(可选) ——> 编码 + 封装 ——> 推流
采集方式:摄像头、屏幕、图像采集卡等
图像处理的场景:美颜、绿幕、头饰
拉流端
看播过程: 拉流 ——> 解封装和解码 ——> 图像处理(可选) ——>渲染
后记
通过这节课程的学习,主要了解了视频的基本元素、视频压缩、直播推拉流协议等的基本概念,学习了通过视频文件的名字知道分辨率、编码格式、音频规格等内容。