上一篇文章介绍了音频的相关知识,接下来我们继续讲视频,比音频复杂一些,不过通过这篇文章,你应该会对视频的相关知识会有所了解,让我们开始吧!
一、电视的成像原理
1、CRT电视成像原理
先让我们看看这个大家伙吧,小时候家里都是这种彩色电视机。
打开他的翘臀看看里面是什么?
这里隐藏的成像的秘密,首先我们要明白几个概念
阴极射线管: 将电信号转换为光信号,下面就是CRT的原理图
栅格图像学说:将一张图片分成横竖分成一个个小栅格,每个栅格显示一种颜色,拼接在一起就形成了一张图片
基于以上两个概念,CRT显示原理就是通过电子枪发射“一束”电子,经过聚焦系统、XY偏转等操作,打到涂有荧光层的屏幕上进行发光。每点亮屏幕的一点(一个小栅格),就称为一个像素。而CRT无重叠的打到屏幕上的最多点数称为分辨率,如我们熟知的1280X1024,表示屏幕上最多有1280X1024个点可以被点亮。打完全部的点,形成了一副完整图像,我们称之为帧。之后会自动从起点开始,接着打下一帧。一秒内打完的帧数,称之为帧率。人眼在每秒25帧以上,就会将图片自动转换为连续的动画。
视频是由帧组成的,帧是由像素组成的,那如何用数值来表示呢?
二、视频图象的数值采样
1、RGB表示
RGB分别表示红,绿,蓝三原色光,通过红绿蓝可以组合出各种颜色。
举个彩色CRT例子,彩色CRT的原理,就是分别点亮R(红)、G(绿)、B(蓝)三基色的荧光点,每个荧光点发出对应强度值的光,因为三个荧光点距离非常小,从而在人眼看来,看到的是三个荧光点组合之后的彩色亮光。
一个彩色像素点就可以用RGB来表示,如果每个颜色用一个字节来表示,那么一个像素点就是3个字节,那么一个1280*720分辨率的图象大小等于:
1280 * 720 * 3 = 2.636MB
RGB这种表示方式,原始的图片数据太大了。如果这样的大小在网络上传播,显然不实际,所以发展出了许多图片压缩算法,比如JPEG, 另外这种更多的用于表示图片信息,对于视频帧更多的采用的是YUV的表示方式。
2、YUV表示
视频是由帧组成的,帧是由像素组成的,那么视频的采样,其最小单位就是像素点的采样。每个像素都可以用YUV采样。“Y”表示明亮度(Luminance、Luma),“U”是色度(Chrominance)、“V”是浓度(Chroma)。
那为啥视频帧采用YUV,而不是用RGB呢?主要有下面几个原因:
1)、兼容黑白电视机,Y是可以和UV分离,如果只有Y,而无UV,则表示的图象就是黑白灰度图象,所以黑白电视机只要处理Y信号,就可以显示黑白图象。当YUV都处理了,那么就是彩色电视了。
2)、YUV比RGB有更高的压缩率,由于人眼对于UV敏感度比较低,所以就可以认为降低UV比重,而人眼无感知,就可以减低一帧的大小,减小传输流量。比如说我们现有的三种YUV采样YUV444, YUV422,YUV420。具体我们可以参考这篇文章
YUV444:表示Y\U\V全采样,如果Y\U\V都是用一个字节表示,那么一个像素点就是3个字节,就跟RGB的大小一样了。一般来说这种表示方式,存储量太大了。
YUV422:表示每两个Y共用一个UV,两个像素点 2*Y + 1*U + 1*V = 4字节,这样就相当于一个像素就只有2个字节。
YUV420: 表示四个Y共用一个UV,4个像素点 4*Y + 1*U + 1*V = 6字节,这样就相当于一个像素就只有1.5个字节。
所以目前视频帧最常用的采样格式是Y420。那么一个1280*720分辨率的视频帧大小等于:
1280 * 720 * 1.5 = 1.318MB
相较于RGB,减少了压缩了一半的大小。
有了以上知识,现在让我们做一道算术题,一段90分钟的视频,分辨率为1280*720,帧率为24,采用Y420数据格式表示。那么其数据量是多大?
1280 * 720 * 1.5 * 90min * 60s * 24fps = 166.8GB
显然这个数据量用于存储太大了,在网络上传输格式不可能。那么唯一的解决办法就是对其进行压缩,也就是视频编码。
三、视频编码和封装格式
视频压缩主要也是从去除冗余信息着手,包括空间冗余信息和时间冗余信息。
空间冗余:一张图片内,同一物体颜色存在空间相关性,说白就是相邻像素在数字表示时相同或者相近,造成的空间上的冗余。对其做压缩处理,称之为空间冗余编码。一般的压缩率为7,比如我们的I帧,就属于帧内编码,压缩空间冗余
时间冗余:在连续视频帧,前后两个视频帧基本相同,或者只有轻微改变,造成时间上的冗余。对其压缩处理,称之为时间冗余编码,比如我们B帧、P帧。
既然视频编码这么重要,所以就出现了很多标准,比如ISO指定的Mpeg1~Mpeg4, ITU-T制定的H261~H264等等,后面文章会着重介绍这些编码的历史沉浮。
接下来我们说说封装格式。
将音频编码数据,视频编码数据,以及其他数据,比如字幕信息都打包成一个文件,文件格式遵循一个固定的标准规范,比如MP4,WAV这种格式规范。具体关系看下图:
四、视频帧概念
1、I帧
俗称关键帧,帧内编码,不需要前后帧,可以解码成一张完整图片,压缩空间冗余信息,压缩率低,所以I帧通常比较大,在实时直播中,过多的I帧会增加带宽压力和传输流量。
2、P帧
前向预测编码帧,俗称运动补偿帧,提取的是前向帧的差异,或者运动特性。压缩时间冗余信息。在解码时,需要参考前向I帧或者P帧,通常压缩率在20.
3、B帧
双向预测编码帧,主要存储的是本帧和前后帧差异,所以在解码的时候需要参考前后帧,实现逻辑上比较复杂,CPU消耗比较大,对解码机器性能有一定要求。不过压缩率能达到50
4、IDR帧
特殊的I帧,除了拥有I帧的特性外,其还有立即刷新作用,即清空参考帧列表(DBP),重新查找参数集,开始一个新的序列,之前的解码的数据将全部清除。这种可以防止如果一个序列发生严重问题时,可以重新刷新,开始新的序列,防止错误一直传播。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
5、参考帧列表
我们知道P帧、B帧都需要参考帧,才能解码,所以就需要一个列表来管理这些参考帧,这个就是参考帧列表
6、GOP
GOP是两个I帧之间的距离,通常在优化rtmp延迟时,会设置这个参数,原因就是GOP的长度会影响到解码端Seek的响应时间。由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长,这样拉流端延迟就会增加。根据经验GOP Size一般来说设置为FPS*1s
五、参考
https://www.jianshu.com/nb/22515965
https://zhuanlan.zhihu.com/p/61747783
https://zhuanlan.zhihu.com/p/61747783