关于视频

图像连续播放形成视频,单个的图像称为一帧(Frame),帧的播放速度称为帧率(Frame Rate),一般用FPS描述帧率,指每秒播放多少帧图像(Frame per Second)。

一般来说,人眼能感觉到视频卡顿的帧率为15帧,低于15帧时,人眼能察觉出画面的不连贯,高于15帧时,人眼的主观感受差别不大。由于视觉滞留效应(指人眼看到的图像消失后,图像仍会在大脑中停留一段时间,约为1/24秒),当视频帧率高于24帧每秒时,人眼就已经无法感知了。为了实现立体视觉,两只眼睛的看到的画面要不一样,这样双眼的立体视觉帧率就至少需要达到48FPS。游戏显卡输出的FPS可以高达几百帧,但这与显卡、显示器帧率不同步导致的撕裂效应有关,参考:画面撕裂、卡顿、垂直同步

关于视频通信延时,当延时小于200ms时质量为优秀,此时类似于面对面聊天,基本无法察觉。延时200ms~500ms,类似于打电话,可以察觉,但基本不影响通信。延时500ms~800ms则可以明显察觉。当延时大于800ms时,就已经不适合实时通信了。

关于视频压缩

分辨率640x480,帧率15,采样格式YUV420,量化深度8bit,其码率为:

640*x480*3/2*15*8bit = 55.296Mbps

参考设置视频编码属性 - 视频通话 - 文档中心 - 声网Agora,该视频属性下推荐的码率约为500kbps,压缩率为1/100。

视频压缩原理

视频数据中的冗余信息

  • 时间冗余:视频中的相邻两帧之间内容相似,存在运动关系。
  • 空间冗余:视频中的某一帧内部的相邻像素存在相似性。
  • 编码冗余:视频中不同的数据出现的概率不同。(参考熵编码,比如游程编程、哈夫曼编码)
  • 视觉冗余:观众的视觉系统对视频中的不同部分敏感程度不同。(参考JPEG压缩)

视频压缩办法

预测编码

主要包括两种方法:

  • 帧内预测:根据当前帧已编码的数据进行预测,利用图像内相邻像素之间的相关性去除视频中的空间冗余。(比如可以在某个较小的图像区域内,用最左边一列的像素和最上面一列的像素来预测该区域的全部像素,方法可以是用这两部分已知的像素求平均值作为剩余像素的值,或是指定某种规则,以最左边或最上面一列的像素通过渐变的方式填充剩余像素。)
  • 帧间预测:将部分已编码的图像作为参考帧,利用前后帧之间的时间相关性去除视频中的时间冗余,比如视频编码中常见的I/P/B帧。

在H.261和MPEG-2等早期标准中便已经引入了基于运动补偿预测的帧间编码算法,在H.264及以后的标准中加入了帧内预测,通过将视频帧划分成宏块和子宏块进行分割,并对子宏块用帧内预测方法压缩空间冗余。

无论是帧内预测还是帧间预测都需要将图像划分成不同的宏块,以在一个更小尺寸的子像素块内进行。如果是帧内预测,那么一个子像素块会先从已编码的相邻子像素块中获取参考值,再从预设的预测模式中选择最佳模式进行编码,并将预测模式写入输出码流。在解码时通过解出的预测模式和已解码的相邻像素重建像素块。

在帧间预测中,宏块分割生成的子像素块在参考帧中搜索最匹配的参考像素块,其中,匹配度最高的像素块相对于当前块在空间域的偏移称为运行矢量。将参考帧的索引号和运动矢量输出到码流中,解码时根据参考帧索引获取指定参考帧,再根据运动矢量就可以预测出像素块。

运动矢量不会直接被编码,而是会分成运动矢量预测(Motion Vector Prediction, MVP)和运动矢量残差(Motion Vector Difference, MVD)两部分。其中MVP是通过已编码完成的信息预测的,MVD是通过熵编码写入输出码流的。已完成编码的相邻像素块,其运动信息大概率具有相关性,甚至运动轨迹完全一致,因此通过预测的方式编码运动矢量在多数情况下可以有效减少码流的数据量。

在未发生场景切换时,视频前后帧之间的相关性通常比视频帧内部相邻像素之间的相关性要大得多,因此帧间编码可以取得比帧内编码更高的压缩比。但帧间编码依赖参考帧,如果参考帧丢失,则会无法对当前帧进行解码,并且会导致后续所有依赖该参考帧的码流帧解码失败。

变换编码

与JPEG图像压缩标准一致,使用离散余弦变换和有损量化实现视频压缩。

熵编码

熵编码对应无损压缩,应用在视频压缩的最后一步,用于对数据进行进一步压缩。在JPEG图像压缩中,图像经过离散余弦变换和量化后,使用游程编码和哈夫曼编码进行熵编码。在视频压缩中,常用的熵编码算法如下:

  • 指数哥伦步编码(UVLC)算法:常用于帧与Slice头信息的解析过程。
  • 上下文自适应的变长编码(CAVLC)算法:主要用于H.264的Baseline Profile等格式的宏块类型、变换系数等信息的编码。
  • 上下文自适应的二进制算术编码(CABAC)算法:主要用于H.264的Main/High Profile和H.265等格式的宏块类型、变换系数等信息的编码。

关于视频压缩的发展历史

参考链接:即时通讯音视频开发(十九):零基础,史上最通俗视频编码技术入门-实时音视频/专项技术区 - 即时通讯开发者社区!

增加一些个人理解和补充:

早期无论是音频还是视频,传输的都是模拟信号。以调频广播为例,将音频波形通过高频载波进行调制,输入的音频是模拟的,输出的调制信号也是模拟的,但这并不影响从调制信号中还原出音频波形。

对视频信号的调制也是类似,在黑白电视阶段,可以把视频亮度的变化看成一个连续的波形,这个波形也可以使用与音频类似的方式进行调制与传输。发展到彩色电视后,为了兼容原来的黑白电视,使用YUV颜色空间转换,这样原来的亮度信号调制不受影响,只需要多增加色度信号调制就可以了。

在数字计算机还远未普及的年代,基于模拟信号的电视广播就已经很流行了,所以很多视频编码的标准都是从模拟电视广播继承过来的,比如P制和N制,逐行和隔行,甚至早期的视频编码标准,连分辨率都只有那么几个,因为能显示视频的电视的分辨率也就那么一些,根本没必要考虑所有的分辨率。(早期电视的分辨率对应CRT显示器的显象管扫描线密集程度,从标准的角度来看,肯定不会每家都生产不一样的分辨率。)

关于视频编码

H264

H265















  • 无标签