再探HEVC——理解不同类型的I帧

Posted zhanghui_cuc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再探HEVC——理解不同类型的I帧相关的知识,希望对你有一定的参考价值。

软编的265码流和android MediaCodec硬编的265码流,I帧的nalu type有所不同

翻看265标准文档,可以发现I帧的nalu type分以下几种

NAL_UNIT_CODED_SLICE_BLA,       // 16   // Current name in the spec: BLA_W_LP  
NAL_UNIT_CODED_SLICE_BLANT,     // 17   // Current name in the spec: BLA_W_DLP  
NAL_UNIT_CODED_SLICE_BLA_N_LP,  // 18  
NAL_UNIT_CODED_SLICE_IDR,       // 19  // Current name in the spec: IDR_W_DLP  
NAL_UNIT_CODED_SLICE_IDR_N_LP,  // 20  
NAL_UNIT_CODED_SLICE_CRA,       // 21  

而我们在Android手机上硬编生成的码流中,I帧的nalu type一般为19、20,软编得到的type却有可能为21,并且当type为21时,可能在某些机型上会发生无法正常解码播放的问题。这是为何?

回看上一篇文章《浅谈OpenGOP与ClosedGOP》,我们可以想到,也许还是和GOP有关,今天就来更深入的探讨下这个问题。


16-21这六种nalu type对应的帧都被定义为IRAP(intra random access point),即帧内编码的随机接入点。

其中CRA(Clean Random Access)是一个OpenGOP的起始帧,这一帧也是一个I帧,同样采用帧内编码,但是这个GOP内的帧间编码帧可以越过CRA参考前一个GOP的数据。

所谓的随机访问点,就是为了方便进行seek、码流切换等操作而设计的。采用CRA作为随机访问点,好处是比IDR帧编码效率更高,压缩比更高。

但是问题也很明显,如果CRA后的某一帧x,需要参考CRA前的某一帧y进行解码,而此时客户端是从CRA帧才开始接入解码播放的,根本拿不到y帧,那么x帧要如何解码播放呢?

这就引入了两个新的概念:RADL和RASL。翻看标准文档,同样看到和它们对应的nalu type

NAL_UNIT_CODED_SLICE_RADL_N,    // 6  
NAL_UNIT_CODED_SLICE_DLP,       // 7 // Current name in the spec: RADL_R  
    
NAL_UNIT_CODED_SLICE_RASL_N,    // 8  
NAL_UNIT_CODED_SLICE_TFD,       // 9 // Current name in the spec: RASL_R  

下面这张图可以很好地解释RADL和RASL

图中帧的图形排列顺序代表显示顺序,数字编号代表解码顺序。显示顺序在IRAP之前,但是解码顺序在IRAP之后的帧被称为Leading Picture,图中4,5,6就是三个Leading Picture。当从3这个CRA接入时,编号为4,6的帧将无法正常解码,需要丢弃掉,因此它们被称为RASL(Random Access Skipped Leading)。5此时仍然可以正常解码显示,因此它被称为RADL(Random Access Decodable Leading)。

此时回看最开始说的nalu type为19和20的两种IDR帧,对应关系如下

NAL_UNIT_CODED_SLICE_IDR(19):May have leading Pictures,即在解码顺序上可能有RADL帧
NAL_UNIT_CODED_SLICE_IDR_N_LP(20):Without leading Pictures,在解码顺序上没有leading pictures

之所以有这两种类型,原因在于可以使得系统层知道IDR是否是第一个输出的图像。IDR_N_LP图像的POC值总是为0,所以如果有关联的RADL图像,则其POC值为负值。

至于nalu type 16-18对应的BLA (Broken Link Access),可以理解为只是CRA在视频流切换情况下的一种特例。视频流在某个IRAP上要求切换到另一个视频流继续解码,则直接将该CRA同另一个视频流中的接入CRA连接,后者便是BLA。由于BLA之前解码到缓存的视频流与当前视频流无关,因此其特性类似于直接从该点进行随机存取后的CRA。

回到最开始的问题,当我们发现软编的码流中出现了CRA帧,就意味着此时的编码设置是OpenGOP的,赶紧关掉吧。


欢迎关注我的公众号灰度五十,分享各类音视频、移动开发知识~

文章帮到你了?可以扫描如下二维码进行打赏,打赏多少您随意~

以上是关于再探HEVC——理解不同类型的I帧的主要内容,如果未能解决你的问题,请参考以下文章

再探HEVC——理解不同类型的I帧

Codecs系列HEVC中三种Intra帧类型的区别:BLA/IDR/CRA

Codecs系列HEVC标准:参考帧管理RPS技术

转 HEVC 参考帧管理(RPS)

HEVC2HM-16.7编码一个CU(帧内部分) 2.帧内预测各种模式实现

左右值再探与decltype