视频压缩编码 gop(Group of Pictures)(I帧间隔)的概念IDRI帧(关键帧,intra picture)P帧B帧帧内压缩帧间压缩pts(显示时间)dts(解码时间)
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频压缩编码 gop(Group of Pictures)(I帧间隔)的概念IDRI帧(关键帧,intra picture)P帧B帧帧内压缩帧间压缩pts(显示时间)dts(解码时间)相关的知识,希望对你有一定的参考价值。
文章目录
前言:
最近看到一句话,
“GOP在一定程度上会影响视频画面质量 - 在码率相同的情况下,GOP越大,意味着P\\B帧越多,也就更容易获取较好的图像质量”
然后回顾了一下目前了解的视频知识,发现怎么都想不明白这句话。
关于视频的基础定义
这里先科普下视频编码、解码、GOP、IDR帧、I帧、P帧、B帧、帧率、码流的基本定义。
GOP:Group of Pictures
顾名思义,就是一组图片,在实际操作中,就是一组完整的视频帧,怎么叫做完整的视频帧?也就是说一个GOP拿出来,必须能够完整的播放、显示。
那GOP就可以推断出来,必须是以I帧开头,这样后面的P帧和B帧才能跟据前向参考帧进行解码显示。
这样也就能理解,为什么GOP是I帧的间隔,从当前这个I帧开始,到下一个I帧结束(一?这里先放个问号)。
看图,从这个I帧开始到下个I帧之前,就是一个GOP:
图A
压缩(也就是编码)
这里我把压缩和编码当作同一回事,视频实际上就是一张张图片连续的播放,就像小人书一样,图片连续播放,里面的画面就好像动起来一样。
视频自然不能直接把一张张图片保存或者传输,会浪费很多存储、导致传输过程中,带宽压力特别大。
这里就需要把图片进行压缩,也就是编码。将一张张图片数据编码成视频帧,视频帧就是一张张的图片压缩之后得到的。
压缩分为帧内压缩和帧间压缩。
帧内压缩:自己本身压缩,不参考其他的帧。
举个压缩的例子,100 000,这个数字大家读的时候,肯定不是一零零零零零零,大家会读做10万或者100K,我们会把后面三个0压缩。
帧间压缩:参考其他视频帧压缩。
再举个 ,1 000 000,上面那个 ,我们读做1000K,我们也可以读做10个100K。当然这只是示例,实际的帧间压缩不可能这么简单。
对于帧间压缩来说,可以这样理解,找不同(大家一起来找茬,这个都玩过),
比如记录一个秒表的走动的视频,秒表的背景是固定的,走动的只有秒表的数字或者指针,那么我们在I帧某保存一刻秒表的完整图像,然后在下一刻只需要保存跟I帧中不同的部分,相同的部分只需要告诉播放器(解码器),除了这一部分,其他部分跟参考帧的视频数据相同。
这样压缩之后,这个视频帧解码就需要参考前面那一个参考帧的数据,这就是帧间压缩。
解码(解压缩)
图B
如图,纯粹是为了理解参考帧和解码顺序(与实际有差别)。
- 2号P帧参考帧是1号I帧,也就是说,解码器需要根据1号I帧的内容,才能还原2号P帧的图像。
- 4号B帧参考帧是3号和5号,那么视频帧头里面参考帧标志会告诉解码器,需要先解码3号帧和5号帧。接下来解码器会将参考帧3号和5号放入参考帧序列,然后再去解码4号帧。(5号帧是参考的谁的?)
- 可以看下8号帧,理解下它和6、7、9、10、11的解码数据。
- 回到问题一,GOP是两个I帧的间隔。从这里说,一个GOP就是1-10号帧,但是10号帧还参考了11号帧,那就违反了GOP是一组完整的图片的定义。所以严格意义上讲GOP必须是以IDR帧开始,到下一个IDR帧结束,一个GOP的所有视频帧的参考帧必须在GOP之中。
视频帧头信息里面还会有pts和dts,pts代表显示时间,dts代表解码时间,这里的时间类似顺序,越大,顺序越靠后。
为什么好多人说GOP是两个I帧的间隔?
对于直播来说,不会有B帧存在,就类似图A,只有I帧和P帧的区别。
原因:直播的实时性要求决定了它不能一个帧到来的时候还要等待它后面的帧才能解码。
I帧:关键帧,intra picture
写个单词,显得专业。
I帧就是采取帧间压缩
的视频帧,它可以单独被解码成一张完整的图片。那么如果某个视频都是I帧,那么一个I帧就是一个GOP。当然一般情况下都不会这样做。
IDR帧:Instantaneous Decoding Refresh
及时解码刷新。我一般称它为immediate refresh ,立刻刷新,IDR帧必须是一个I帧,但是I帧不一定是IDR帧,这个帧出现的时候,是告诉解码器,可以清除掉所有的参考帧,这是一个全新的序列,新的GOP已经开始。
P帧:Predictive Picture(预测编码图像帧)
会参考之前的I帧或者P帧,采用运动预测的方式进行帧间编码。
B帧:Bidirectionally predicted picture(双向预测编码图像帧)
双向预测,从名字就可以看出,它需要进行双向参考,也就是两个参考帧,一个在它的前面,一个在它的后面,这就是它跟P帧的区别,多了一个参考帧,当然压缩率也会比P帧高。
帧率:
刚才提到,视频其实就是一张张图片连续播放。
那么就涉及到一个问题,一秒钟播放多少张图片?也就是一秒钟多少个数据帧,这个数字就是帧率。
日常使用中,我目前见到的固定帧率的情况比较多,比如市面上一些智能摄像头之类的。
码流:或者称为码率,只针对视频数据,单位时间内视频数据量大小,一般以秒为单位(KB/S)(码率是通过什么算法控制的 ?)
码率=视频数据大小/视频时间长度。
对于直播之类的计算,码流=视频传输数据量/传输时间。
在直播中,两种方式计算的码流应该是近似相等的,否则就会出现类似延时,卡顿等情况。
结尾
“GOP在一定程度上会影响视频画面质量 -
在码率相同的情况下,GOP越大,意味着P\\B帧越多,也就更容易获取较好的图像质量”
笔者看到了多次类似的话,细想总觉得有很多迷惑的地方。
首先,P/B帧的数量多少,只影响画面流畅度,不影响图像还原度和清晰度。
其次,码率固定情况下,P/B越多,那就意味着单位时间内,P/B的大小更小(码率=单位时间内所有帧数据的大小之和),
P和B越小,意味着压缩率更高,虽然视频会更加流畅,但是图像质量也就是图像还原度会更低。
在这种情况下,说容易获得较好的图像质量好像有点牵强,毕竟人眼通常情况下超过24帧的帧率之后,就不会感觉到画面卡顿。
帧率固定的情况下(这种情况下,我们可以视为码流和GOP大小成正比例关系),GOP大小会影响画面质量。
比如看直播时候,如果画面波动比较大,码流就会大起来,这个时候就能分析出来,P帧会变大,画面幅度大,导致压缩率变低。
如果这个时候强制限制码流的话,画面可能会失真,可能出现马赛克现象。(AR:所以避免马赛克的话就是不能限制码流?)
如果画面静止不动,那么P帧会很小,压缩率很高,码流也就是GOP大小自然会变小。
(AR:GOP大小∝码率?(正比于))
GOP拉大,码率不变,帧率不变,那就是每个帧的数据量变大,压缩率变低,画面还原度变高
0928更新GOP拉大和GOP拉长的问题(实际情况需要自己判断)
拉长是指本来1s产生一个GOP,也就是一秒一个IDR帧,但是改成2s一个GOP,帧率不变。
拉大是指GOP容量变大,本来1sGOP大小100KB,变成120KB,帧数不变。
如果GOP中帧数增加,在压缩率稳定的情况下(正常情况下压缩率会变化,看图像变化比例)必然会造成GOP变大,如果GOP大小保证不变,可以采取减少I帧(注意不是IDR帧)来换取更多的P和B帧。
(AR:我们的场景是图像中小范围波动,我们要保证这个小范围的清晰度,需要增加更多的P帧?)
看到的许多文献中,关于GOP拉大还是拉长都没有说明,在计算码流变化之中,需要明确GOP是怎么变化的。
根据我在直播摄像头的观察,在帧率固定的前提下,比如说2s一个I帧(上面说了直播一般I帧和IDR帧等同,没有B帧),影响码流大小的是画面变化幅度,如果画面静止不动的话,码流保持在很稳定的状态;如果画面变化幅度比较大,那码流就会变大。
以上是关于视频压缩编码 gop(Group of Pictures)(I帧间隔)的概念IDRI帧(关键帧,intra picture)P帧B帧帧内压缩帧间压缩pts(显示时间)dts(解码时间)的主要内容,如果未能解决你的问题,请参考以下文章