目录
在前述的文章(H265编码丢帧问题分析_h265视频模糊问题如何分析-CSDN博客)中,我们讲述了 海思H265丢帧问题的分析,本文 描述此问题的解决。
GOP概念
Group of Pictures
GOP ( Group of Pictures) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。
I 帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。
海思几种GOP模式
NormalP 模式 GOP
每个 P 帧参考一个前向参考帧。也没有B帧。参数设置
s32IPQpDelta,意思是I和P帧之间 QP值的差值。
推荐设为 3,值越大 I 帧越大, I 帧质量越好,质量越好,则码率越高。
DualP 模式 GOP 结构
SP 指特殊的 P 帧,这里简称 SP 帧,该帧 Qp 值推荐小于其他 P 帧 Qp 值,
u32SpInterval=0 指不支持 SP 帧。
DualP 模式下 P 帧参考就近的两个前向参考帧,能够利用更多参考帧的时域相关性提升编码压缩性能。主要应用在运动且有低延时要求的场景, DualP 压缩性能低于 BipredB 模式但高于 NormalP 模式。 DualP 由于两个参考帧均使用前向参考帧,因此不存在编码和解码延时。
目前我们采用 NormalP 模式 GOP
问题复现场景
问题复现步骤
1) 海思编码守护进程启动,等待业务APP的交换信息
2)业务APP将待编码的图片的宽高尺寸等信息告知海思芯片。海思据此初始化编码器。
3)业务APP开始下发编码信息,编码芯片开始工作。
4)杀掉业务APP,而后再次重新启动。
根据前述文章分析,我们得知,在步骤4时,编码器编码出去的图像缺少了I帧,导致后续P帧不能被正确解析。
编码器状态
猜测编码器在多次业务运行时处于如上的状态:
我们GOP由30帧图像构成,在第一次业务运行完毕时,图像实际只有70帧,这导致最后的GOP实际只输出了10帧,而编码器期望输出30帧后,再输出下一次的I帧。
问题解决
通过上述分析,我们只需要在业务APP再次运行时,通知编码器,让其下一帧输出I帧,这样重新开始一个GOP,保证编码组的完整性就可以解决问题。
海思手册提供如下接口完成此功能,在每次业务APP时,通知编码进程调用此接口。
HI_MPI_VENC_RequestIDR
如果通道未创建, 则返回失败。
接受 IDR 帧请求后, 当 bInstant =0 时,则在帧率控制的下一帧编出 IDR 帧,
当bInstant =1 时,则立即编出 IDR 帧,不受帧率控制约束。
IDR 帧请求,只支持 H.264/H.265 编码协议。
由于此接口不受帧率控制影响,每调用一次即编出一个 IDR,调用频繁会影响码
流帧率和码率的稳定,使用时需要注意。
当 GOP 模式为 Smartp 或 B 帧模式下,请求 IDR 帧会延时生效
s32Ret = HI_MPI_VENC_RequestIDR(g_VencChn, 0); //下一帧编码为IDR帧
if(HI_SUCCESS != s32Ret)
{
printf("HI_MPI_VENC_RequestIDR err 0x%xn",s32Ret);
}
最终呈现如下的效果,即每次开始的编码输出都是完整的GOP。
总结
GOP作为编解码的独立单元,其由I B P构成,I帧作为关键帧,缺少I帧,其后续P帧浪费了。
对于不同GOP的具体编码时延及对解码器的要求,后续再整理输出。