视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储,人们发现视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就大大减少了视频数据的文件,因此有了各种视频压缩标准,比如H.264,H.265,MJPEG等。
在H.264压缩标准中I帧、P帧、B帧用于表示传输的视频画面。
1、I帧
I帧又称帧内编码帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,可以简单理解为一张静态画面。视频序列中的第一个帧始终都是I帧,因为它是关键帧。
关键帧间隔
指定的关键帧之间的秒数。关键帧显示整个图像,而间隔帧(即 delta 帧)仅包含两个关键帧之间的差异,因此要小一些。如果增加关键帧之间的时间,该文件大小会减小。如果减少关键帧之间的时间,该文件大小则增加。如果视频内容主要是静态的场景,关键帧间隔可以大一点。对于运动的场景,关键帧间隔需要小一点。
2、P帧
P帧又称帧间预测编码帧,需要参考前面的I帧才能进行编码。表示的是当前帧画面与前一帧(前一帧可能是I帧也可能是P帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。与I帧相比,P帧通常占用更少的数据位,但不足是,由于P帧对前面的P和I参考帧有着复杂的依耐性,因此对传输错误非常敏感。
3、B帧
B帧又称双向预测编码帧,也就是B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是对解码性能要求较高。
带有I帧、B帧和P帧的典型视频序列。P帧只需要参考前面的I帧或P帧,而B帧则需要同时参考前面和后面的I帧或P帧。
一般平均来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。
减少数据量的基本方法
可以通过各种方法在一个图像帧内或者在一系列帧之间减少视频数据量。
在某个图像帧内,只需要删除不必要的信息就可以减少数据量,但这样做会导致图像的分辨率下降。
在一系列的帧内,可以通过差分编码这样的方法来减少视频数据量,包括H.264在内的大多数视频压缩标准都采用这种方法。在差分编码中,会将一个帧与参考帧(即前面的I帧或P帧)进行对比,然后只对那些相对于参考帧来说发生了变化的像素进行编码。通过这种方法,可以降低需要进行编码和发送的像素值。
对M-JPEG格式来说,上述序列中的三个图像分别作为独立的图像(I帧)进行编码和发送,彼此之间互不依赖。
对差分编码(包括H.264在内的大多数视频压缩标准都采用这种方法)来说,只有第一个图像(I帧)是将全帧图像信息进行编码。
如果是根据像素块(宏块)而不是单个的像素来检测差别并进行差分编码,还可以进一步减少需要编码的信息量;因此,可以对更大的区域进行对比,而只需对那些存在重大差别的块进行编码。此外,对发生更改的区域位置进行标记的相关开销也将大大降低。
然而,如果视频中存在大量物体运动的话,差分编码将无法显著减少数据量。这时,可以采用基于块的运动补偿技术。基于块的运动补偿考虑到视频序列中构成新帧的大量信息都可以在前面的帧中找到,但可能会在不同的位置上。所以,这种技术将一个帧分为一系列的宏块。然后,通过在参考帧中查找匹配块的方式,逐块地构建或者“预测”一个新帧(例如P帧)。如果发现匹配的块,编码器只需要对参考帧中发现匹配块的位置进行编码。与对块的实际内容进行编码相比,只对运动矢量进行编码可以减少所占用的数据位。
基于块的运动补偿图示
这是我很早之前整理的安防视频监控知识,没有维护和更新了,现在这个网站已经转型成个人博客。需要了解安防相关知识,资料的可以去我的这个安防知识专业网站:https://ipc.name
评论