通过RTP识别H264中的IDR数据包

时间:2019-06-18 20:30:14

标签: c h.264 rtsp rtp

我试图通过rtp从h264识别c中的idr数据包。

我遵循此answer,但我不明白。

我是否需要搜索00 00 0100 00 00 01,并且IDR的起始代码不是0x65?

因为我看到了所有已定义的NALU的表

  

类型名称

0 [unspecified]

1 Coded slice
2 Data Partition A

3 Data Partition B
4 Data Partition C

5 IDR (Instantaneous Decoding Refresh) Picture
6 SEI (Supplemental Enhancement Information)
7 SPS (Sequence Parameter Set)
8 PPS (Picture Parameter Set)
9 Access Unit Delimiter    10 EoS (End of Sequence)    11 EoS (End of Stream)    12 Filter Data 13-23 [extended] 24-31 [unspecified]

此代码用于查找其他条件(类型= 5和更多)

public static bool 
isH264iFrame(byte[] paket)
{
    int RTPHeaderBytes = 0;

    int fragment_type = paket[RTPHeaderBytes + 0] & 0x1F;
    int nal_type = paket[RTPHeaderBytes + 1] & 0x1F;
    int start_bit = paket[RTPHeaderBytes + 1] & 0x80;

    if (((fragment_type == 28 || fragment_type == 29) && nal_type == 5 && start_bit == 128) || fragment_type == 5)
    {
        return true;
    }

    return false;
}

那么如何识别idr数据包?

1 个答案:

答案 0 :(得分:0)

您发布的代码并不涵盖所有情况。实际上,您应该首先阅读有关H.264的RTP有效负载格式的rfc。取决于RTP数据包化,IDR可以有不同的RTP数据包类型:

  • 单个单位数据包
  • STAP-A / STAP-B数据包
  • MTAP数据包
  • FU-A / FU-B数据包。

您发布的代码实际上处理FU-A / FU-B(通过(fragment_type == 28 || fragment_type == 29) && nal_type == 5 && start_bit == 128)检查)和单个单位大小写(通过fragment_type == 5检查)。 RTP实际上不使用附件B格式中使用的00 00 00 0100 00 01前缀。因此,您只需要能够从RTP标头中确定数据包的类型和所包含的NAL单元类型。阅读RFC后,应该清楚该怎么做。