C 通过rtp识别h264中的idr数据包

C 通过rtp识别h264中的idr数据包,c,h.264,rtsp,rtp,C,H.264,Rtsp,Rtp,我试图通过rtp从h264识别c中的idr数据包 我明白了,但我不明白 我是否需要搜索00 00 01或00 00 01且idr的平均起始代码大于0x65 因为我看到了一张所有被定义的NALUs的表格 类型名 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 (S

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

我明白了,但我不明白

我是否需要搜索
00 00 01
00 00 01
且idr的平均起始代码大于0x65

因为我看到了一张所有被定义的NALUs的表格

类型名

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]
这段代码用于查看其他条件(type=5及更多)


那么如何识别idr数据包呢?

您发布的代码并不涵盖所有情况。实际上,您应该从读取H.264的on RTP有效负载格式开始。根据RTP分组的不同,IDR可以有不同的RTP分组类型:

  • 单nal单元数据包
  • STAP-A/STAP-B数据包
  • MTAP数据包
  • FU-A/FU-B数据包

您发布的代码实际上处理FU-A/FU-B(通过
(fragment|u type==28 | | fragment|u type==29)和&nal|u type==5&&start_bit==128)
检查)和单个nal单元情况(通过
fragment|u type==5
检查)。RTP实际上没有使用
00 00 01
00 01
前缀,这些前缀在附录B格式中使用。因此,您只需要能够从RTP报头确定数据包的类型和包含的NAL单元类型。阅读RFC后,应该清楚地知道如何做。

谢谢。我想了解用rtp包装的h264数据。h264数据中是否存在每个数据包的序列号和/或时间戳,或者这些数据仅存在于rtp数据中?
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;
}