I帧、B帧、P帧、IDR帧,GOP相关


I 帧( intra frame )帧内编码帧与IDR帧

       I 帧通常是每个 GOP的第一个帧,自带全部信息的独立帧。经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。

IDR帧(Instantaneous Decoding Refresh frame),即时解码刷新帧。

        I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。 IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。 IDR会导致DPB(DecodedPictureBuffer 参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。 
       对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧 。
        收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。
        对IDR帧的处理(与I帧的处理相同):(1) 进行帧内预测,决定所采用的帧内预测模式。(2) 像素值减去预测值,得到残差。(3) 对残差进行变换和量化。(4) 变长编码和算术编码。(5) 重构图像并滤波,得到的图像作为其它帧的参考帧。
       多参考帧情况下,  举个例子 :有如下帧序列: IPPPP P  PPP ……。按照 3 个参考帧编码。
       因为“按照 3 个参考帧编码”,所以参考帧队列长度为 3 。
       遇到蓝色的 I 时,并不清空参考帧队列,把这个 I 帧加入参考帧队列(当然 I 编码时不用参考帧。)。再检测到红色的 P 帧时,用到的就是 PPI 三帧做参考了。


P帧(predictive-frame):前向预测编码帧

    在针对连续动态图像编码时,将连续若干幅图像分成P,B,I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。
P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧某点样值,从而可得到完整的P帧。
有的视频序列比较简单,就没有B帧,

B帧(bi-directional interpolatedprediction frame):双向预测内插编码帧

B帧的预测与重构
 B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200:1的高压缩。
 B帧是以前面的I或P帧和后面的P帧为参考帧,找出B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中。

GOP(Group of pictures )画面组:

       一个GOP是一组连续的画面。GOP结构一般两个数字,如M=3,N=12。M指定I帧和P帧之间的距离,N指定两个I帧之间的距离。上面的M=3,N=12,GOP结构为:IBBPBBPBBPBBI。在一个GOP内I frame解码不依赖任何的其它帧,p frame解码则依赖前面的I frame或P frame,B frame解码依赖前最近的一个I frame或P frame 及其后最近的一个P frame。

开GOP、闭GOP和CRA:

        闭合GOP和开放GOP(closed GOP/open GOP),CRA。闭合GOP是H.264中GOP的格式。在H.264的GOP中,所有的GOP都是独立解码的,与其他GOP无关,即它们都是“封闭”的。但是在HEVC中,GOP的结构发生了变化,采用了“开放”的结构,在解码过程过可能会参考其他GOP的数据。这时,一个GOP的起始帧命名为CRA,clean random access,同样采用帧内编码,但是这个GOP内的帧间编码帧可以越过CRA参考前一个GOP的数据,这便是GOP的open。

### 解决视频流中开头的IDR丢失问题 当视频流中的第一个IDR丢失时,后续解码过程会受到影响,因为解码器依赖于IDR来初始化解码状态并清除之前的状态。为了修复这个问题,可以采取以下几种方法: #### 方法一:重新发送完整的序列头数据 如果可能的话,在检测到IDR丢失的情况下,可以从服务器端或传输层重传整个包含SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)信息的数据包。这确保了解码器能够获取必要的参数集,并从下一个可用的关键开始正常工作。 ```python def resend_sequence_header(): # 假设这是用于请求重新发送的方法 request_retransmission_of_sps_pps() ``` 这种方法适用于具有反馈机制的网络环境,比如RTMP协议下的直播场景[^1]。 #### 方法二:插入人工生成的IDR 另一种解决方案是在客户端侧创建一个人工合成的IDR作为替代品。虽然这不是最优方案,但在某些情况下可能是唯一的选择。此操作涉及构建一个新的NAL单元,并设置其类型为IDR slice (NalUnitType=5),同时附带有效的SPS/PPS NALUs。 ```c++ void insert_artificial_idr_frame() { // 创建新的 IDR Slice 和 SPS/PPS Nalus } ``` 需要注意的是,这种方式要求应用程序具备足够的编码能力以生成合法且兼容的标准格式比特流。 #### 方法三:利用GOP结构特性调整播放起点 对于预录制的内容而言,可以通过跳过受损部分直到遇到下一个完整的GOP(Group Of Pictures)起始位置来进行恢复。由于每个GOP通常都始于一个IDR,因此这样做可以在一定程度上缓解因缺少首个IDR而导致的问题。 ```bash ffmpeg -i input.mp4 -ss 00:00:05 -codec copy output.mp4 ``` 上述命令通过`ffmpeg`工具实现了基于时间戳(`-ss`)裁剪的功能,从而绕过了潜在损坏的部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值