IDR 关键帧 GOP

IDR帧是带有SPS和PPS的特殊I帧,解码器接收到IDR帧时会清空reference buffer。在GOP区间内,所有帧仅依赖该区间内的信息解码。ffprobe可识别关键帧,IDR后的P-Frame和B-Frame不引用IDR前的帧,确保错误隔离。生成I-Frame和P-Frame涉及scenecut和keyint参数调整。

关键帧就是IDR帧
IDR是一种前面带SPS PPS的I帧。
参考 P-Frame 、B-Frame、I-Frame、GOP、IDR

IDR和关键帧

  • IDR属于I帧,但是I帧不一定是IDR帧。只有IDR帧,才有SPS和PPS。解码器收到IDR帧时,将reference buffer清空;而收到I帧不会清空reference buffer。也就是说,对某个IDR帧之后的帧,解码器不会参考这个IDR帧之前的任何帧做解码。对某个I帧之后的帧,解码器可能会参考这个I帧之前的帧做解码。

GOP区间

  • 两个IDR帧之间的区间,从一个IDR帧开始,到下一个IDR前的帧结束,叫做IDR区间,又叫做GOP区间。closed GOP设定下,GOP区间可以看做是独立的一段视频:它里面的所有帧,都不需要参照任何区间之外的东西,只要 一个GOP区间是齐全的,区间里面所有的帧都能被解码。

ffprobe key_frame

  • 从pict_type=I可以看出这是个关键帧,
  • 然后key_frame=1 表示这是IDR frame,
  • 如果key_frame=0表示这是Non-IDR frame。

                
### I、P、BGOP的概念及在视频编码中的作用 #### 1. I(Intra-coded Frame) I关键帧,也被称为内编码。它不依赖于任何其他进行解码,而是通过内压缩技术单独生成。I包含完整的图像信息,因此其数据量通常较大。在视频编码中,I的作用是提供一个参考点,用于后续P和B的预测编码[^4]。 #### 2. P(Predicted Frame) P是向前参考,使用间压缩技术生成。P基于前面已经解码的I或P进行预测编码,只存储与前一之间的差异信息。因此,P的数据量通常比I小得多。P的作用在于减少冗余信息,提高视频编码的压缩效率[^4]。 #### 3. B(Bidirectional Predicted Frame) B是双向参考,使用间压缩技术生成。B基于前后两个已解码的(I或P)进行预测编码,只存储与前后之间的差异信息。由于B需要前后作为参考,它的解码顺序可能不同于播放顺序。B的数据量通常最小,约为I的1/4大小。B的主要作用是进一步提升压缩效率,尤其是在场景变化较小的情况下[^4]。 #### 4. GOP(Group of Pictures) GOP是一组连续的视频,通常以I开头,然后包含一系列的P和BGOP的大小可以根据编码器的设置调整。较大的GOP可以提高视频的压缩效率,但会增加延迟。GOP的作用是将视频分割为多个独立的序列,每个序列以I为起点,便于解码器快速定位和解码特定部分。此外,GOP还影响视频的质量和响应速度。例如,过长的GOP可能导致Seek操作响应时间变长,因为解码某个P或B时需要先解码整个GOP内的I及之前的预测[^2]。 #### 5. 视频编码中的作用 - **压缩效率**:通过使用P和B,视频编码可以显著减少冗余信息,从而实现更高的压缩效率。 - **错误恢复**:I作为参考点,可以在遇到错误时重新开始解码,防止错误传播。IDR是一种特殊的I,能够立即刷新解码器缓冲区。 - **场景切换**:在场景切换时,编码器通常会自动插入一个新的I,以确保解码的准确性[^3]。 - **延迟控制**:较大的GOP可以提高压缩效率,但会增加延迟,因此在实时通信中通常使用较小的GOP[^2]。 ```python # 示例代码:模拟GOP结构 class GOP: def __init__(self, i_frame, p_frames, b_frames): self.i_frame = i_frame self.p_frames = p_frames self.b_frames = b_frames def decode(self): decoded_frames = [self.i_frame] for p in self.p_frames: decoded_frames.append(p) for b in self.b_frames: decoded_frames.insert(decoded_frames.index(p) - 1, b) return decoded_frames # 创建一个简单的GOP i_frame = "I" p_frames = ["P1", "P2"] b_frames = ["B1", "B2", "B3"] gop = GOP(i_frame, p_frames, b_frames) decoded_order = gop.decode() print("解码顺序:", decoded_order) ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等风来不如迎风去

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值