C 通过rtp识别h264中的idr数据包
我试图通过rtp从h264识别c中的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
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;
}