音视频开发基础知识:I帧、P帧、B帧、GOP、IDR和PTS、DTS
1。视频传输原理
视频利用了人类视觉永久性的原理。通过重复一系列图像,给人眼一种运动感。仅发送视频图像就需要非常大量的视频,这对于现有的网络和存储空间来说是无法接受的。为了更方便地传输和保存视频,人们发现视频中存在大量重复信息。如果在发送端去除重复数据并在接收端恢复,视频数据文件的大小将大大减小。因此,H.264视频压缩标准。
视频的原始图像数据采用H.264编码格式压缩,音频样本数据采用AAC编码格式压缩。一旦视频内容被编码和压缩,它对于存储和传输来说确实很有用。不过,当你想要观看播放的时候,还需要一个解码的过程。因此,显然有必要在编码和解码之间达成一个编码器和解码器都能理解的约定。对于视频图像编解码来说,这种做法非常简单:
编码器对多张图片进行编码,生成GOP(Group of Pictures)片段,解码器在播放时逐一读取这些片段。解码 GOP 后,读取图像,然后渲染并显示。 GOP(Group of Pictures)是由一个 I 帧和多个 B/P 帧组成的一系列连续图片。它是视频图像编码器和解码器操作的基本单元。它的顺序是重复,直到图像用完。 I帧是内部编码帧(也称为关键帧),P帧是前向投影帧(前向参考帧),B帧是双向插值帧(双向参考帧)。简单来说,I帧是完整的图像,而P帧和B帧则记录相对于I帧的变化。没有 I 帧,P 帧和 B 帧就无法拆卸。
在H.264压缩标准中,I、P和B帧用于表示传输的视频图像。
2。 I帧、P帧、B帧、GOP
I帧
I帧:内部编码图像(内部编码图像帧),I帧代表关键帧,你可以理解为这个相框完整的保存下来;解码时只需要该帧的信息(因为它包含整个图像)。 I 帧,也称为帧内帧,通常是每个 GOP(MPEG 使用的视频压缩技术)的第一帧。适度压缩后,可以作为随机使用的参考点,也可以作为图像使用。大象。在MPEG编码过程中,一些视频帧序列被压缩为I帧;有些包装在 P 型框架中;有些封装在 B 帧中。I帧方法是一种帧内压缩方法,也称为“关键帧”压缩方法。 I帧方法是一种基于离散余弦变换(DCT)的压缩技术,与JPEG压缩算法类似。采用工字框包装,包装比例可达1/6,且包装痕迹不明显。
【I帧特点】
- 它是一个全帧压缩编码帧。进行JPEG压缩编码和全帧图像数据传输;
- 解码时,仅使用I帧数据即可重建整个图像;
- I-frame描述了图像背景和运动物体的细节;
- I 无需参考其他图像来创建框架;
- I帧是P帧和B帧的参考帧(其质量直接影响同组后续帧的质量);
- I帧是帧组GOP Frame(第一帧)的基础,组内只有一个I帧;
- I帧不需要考虑运动矢量;
- I帧占用的数据信息量较大。
【I帧编码过程】
- 进行帧内预测,并设置要使用的帧内预测模式。
- 将像素值减去预测值即可得到残差值。
- 对余数进行变换和量化。
- 变长编码和算术编码。
- 重建图像并对其进行过滤,所得图像用作其他帧的参考帧。
例如:在视频会议系统中,终端设备发送到MCU(或从MCU发送到终端)的图像并不是每次都向远端发送完整的图像,而是只发送最后的图像到远端。对上一个图像的更改。如果网络状况不好,终端的接收远端或发送到远端的图像会丢包,导致图像模糊、图像停止。这种情况下,如果没有I帧机制允许远端重传新的完整图像到本地(或者本地重传新的完整图像到远端)的话,终端的输出图像会变得越来越多。思路不清、卡壳,导致会议无法正常运转。行为。
如果视频播放过程中I帧消失,则下一个P帧无法解码,视频黑屏;如果P帧消失,视频画面就会显得模糊。 、马赛克等现象。
在视频会议系统中,I帧只出现在会议限制的带宽内,不会影响会议的带宽。 I帧机制不仅存在于MCU中,还存在于视频墙服务器和存储传输服务器中。其目的是解决因网络条件不好而造成的丢包,例如图像模糊、卡顿等,影响会议的正常进行。
P 帧
P 帧:预测编码图像(前向预测编码图像帧)。P 帧表示该帧与前一个关键帧(或 P 帧)之间的差异。解码时,需要将该帧中指定的图像与之前缓存的图像进行差值设置,以生成最终图像。 (也就是说,差异帧,P帧中没有完整的图像数据,只有与前一帧不同的信息)
【P帧预测与重建】
P帧使用I帧作为一个参考系。找到I帧的P帧中“某个点”的预测值和运动矢量,取预测差值并与运动矢量一起发送。在接收端,根据运动向量在I帧中找到P帧“指定点”的预测值,并与差值相加,得到P帧“指定点”的样本值-帧,产生完整的P帧。 ?向量(预测误差);
B 帧
B 帧:双向预测图像( 双向预测编码图像帧)。 B帧是双向差分帧,即B帧存储了本帧与前后帧的差异。也就是说,要解码B帧,不仅需要获取之前的缓存图像,还需要解码后面的图像。帧数据的叠加给出了最终图像。 B帧的压缩比高,但是解码时处理器很累。
【B帧预测与重建】
B帧以前一个I或P帧和下一个P帧为参考帧,“找到”B帧的预测值和“某个点”两次运动向量并取预测差值和运动向量来发送。接收端根据运动向量从两个参考帧中“找到(计算)”预测值,并将其与差值相加,得到B帧“特定点”的样本值,从而得到完整的B -框架。利用运动预测进行帧间双向预测编码
【B 帧的特点】
- B 帧是根据前一个 I 或 P 帧以及下一个 P 帧进行预测的;
- B帧传输与前一个I帧或P帧与后一个P帧之间的预测误差以及运动矢量有关;
- B帧是双向预测编码帧;
- B帧压缩比最高,因为它只反映运动物体在C参考帧之间的变化,预测更准确;
- B帧不是参考帧,不会引起解码错误传播,占用资源相对较少。我只需要自己完成即可。对于P,解码器只需要缓存之前的图像即可。当遇到P时,就使用之前缓存的图像。那么,如果视频流只有I和P,解码器可以忽略接下来的数据,边读边解码,线性进行,这对大家来说都是非常好的。那么为什么要采用B型框架呢?
网上很多电影都使用B帧,因为B帧存储了前后帧的差异,比P帧能节省更多的空间,但这样文件大小就减小了,解码器也变得繁琐。因为不仅需要使用之前缓存的图像进行解码,而且还必须知道下一个I或P图像(即预读取和预解码)。而且,不能简单地丢弃B帧,因为B帧实际上还包含图像信息,如果简单地丢弃并简单地与前一帧重复,就会造成图像延迟(实际上是丢帧)。还有,为了节省空间,网络电影往往会使用大量的B帧,大量的B帧。 ,对于不支持B帧的玩家来说会造成更多问题,画面会更加卡顿。
【显示和解码序列图】
GOP(序列)和IDR
H264的图像以为单位排列。序列是对图像进行编码后的数据流。
系列第一张图叫IDR图(立即更新图片),IDR图都是I帧图片。 H.264 引入了 IDR 图像以实现去同步。当解码器解码IDR图像时,它立即清除参考帧队列,打印或丢弃所有解码数据,再次搜索参数集,并开始新的序列。这样,如果之前的序列出现重大错误,就有机会重新同步。 IDR 图像之后的图像永远不会使用 IDR 图像之前的图像的数据进行解码。
系统是图像编码后创建的一系列数据流,其内容差别不大。当运动变化相对较少时,序列可能会很长,因为小的运动变化意味着图像的内容变化很小,因此可以组装一个I帧,然后继续P帧和B帧。当运动变化较大时,序列可以相对较短,例如可以包含1个I帧和3或4个P帧。
在视频编码序列中,GOP 为 Picture Group(Picture Group ),指两个 I 帧之间的距离,Reference( 参考周期)P 之间的距离帧。两个I帧之间形成一个图像组,即GOP(Group Of Picture)。 ?只有这样才能创建出完整的图片,而B帧必须参考前面的I帧或P帧以及下一个P帧才能创建完整的图片。这就产生了一个问题:首先出现的视频流的 B 帧无法立即解码。它必须等待它所依赖的下一个 I 帧和 P 帧首先被解码。这样就造成播放时间和解码时间不一致。 ,顺序打乱了,那这些帧怎么播放呢?目前正在引入另外两个概念:DTS 和PTS。 ?播放器应该什么时候解码这个数据帧?
PTS(性能时间戳):即屏幕时间戳。该时间戳用于告诉播放器何时显示该帧的数据。虽然DTS和PTS是用来控制播放头的行为的,但它们是由编码器在编码过程中生成的。
视频采集时,一帧被编码并一帧一帧地发送。 PTS 是在编码期间创建的。这里,必须特别注意帧的编码方式。正常场景下,编码器对一个I帧进行编码,然后跳回几帧,以编码后的I帧为基帧编码下一个P帧,然后跳回到I帧之后的下一帧。编码后的I帧和P帧之间的帧被编码为B帧。然后,编码器再次跳过几帧,使用第一个 P 帧作为基帧编码另一个 P 帧,然后跳回以用 B 帧填充显示序列中的间隙。此过程通过每 12-15 个 P 和 B 帧添加一个新的 I 帧来继续。P帧是由前面的I帧或P帧图像预测的,而B帧是根据前面的两个P帧或一个I帧和一个P帧预测的,所以编解码器和显示顺序
假设编码器采集到的帧是这样的:
I B B P B B P
那么它的显示顺序(PTS)应该是这样的: ❝1 1 5 2 Coding 编码器的编码顺序为:
1 4 2 3 7 5 6
推流顺序也是按照编码顺序推送,即
I P B B P BI P B B P B
I P B B P B B
此刻解码时,也是根据接收到的视频流逐帧解码。接收一帧并解码一帧是因为编码时根据I、B、P的依赖关系进行了反转。 ,收到数据后立即解码。那么解码顺序为:
I P B B P B B DTS:1 2 3 4 5 6 7 PTS:1 4 2 3 7 5 6
可以看到解码出来的对应PTS并不连续。为了正确显示视频流,我们目前需要根据PTS重新调整解码帧,即
I B B P B B P DTS:1 3 4 2 6 7 5 PTS:1 2 3 4 5 6 7
另外,使用B帧并不是必须的。在实时交互式直播系统中,很少使用B帧。主要原因是在压缩和解码B帧时,由于双向参考,需要缓冲更多的数据,占用的CPU也更大。由于实时性要求,一般不使用。不过,玩家经常会遇到带有 B 帧的 H264 数据。在没有B帧的情况下,帧记录顺序与帧显示顺序相同,PTS和DTS值也相同。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。