我需要在 RTP 数据包中检测 MPEG4 I-Frame。我知道如何删除 RTP header 并在其中获取 MPEG4 帧,但我不知道如何识别 I 帧。
它有特定的签名/标题吗?
最佳答案
好的,所以我想出了 h264 流。
如何检测 I 帧:
我无法弄清楚 MPEG4-ES 流......有什么建议吗?
编辑:H264 IDR
这个 为我的 h264 流(
fmtp:96 packetization-mode=1; profile-level-id=420029;
)工作 。您只需传递表示通过 RTP 接收的 h264 片段的字节数组。如果您想传递整个 RTP,只需更正 RTPHeaderBytes
值以跳过 RTP header 。我总是得到 I 帧,因为它是唯一可以分段的帧,请参阅 here 。我在我的服务器中使用了这段(简化的)代码,它就像一个魅力!!!!如果 I 帧 (IDR) 未分段,则 fragment_type
将为 5,因此此代码将为分段和未分段 IDR 返回 true
。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;
}
这是 NAL 单元类型表:
Type Name
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]
编辑 2:MPEG4 I-VOP
我忘了更新这个...感谢 Che 和 ISO IEC 14496-2 文档,我设法解决了这个问题! Che 很有仪式感,但他的回答并不那么精确......所以这里是如何找到 I、P 和 B 帧(I-VOP、P-VOP、B-VOP)的简而言之:
000001B6
(十六进制)开头。所有 MPEG4 帧 (I,P,B) B6
的字节之后的接下来的两位) )。这 2 位告诉你 VOP_CODING_TYPE,见表:VOP_CODING_TYPE (binary) Coding method
00 intra-coded (I)
01 predictive-coded (P)
10 bidirectionally-predictive-coded (B)
11 sprite (S)
因此,要查找 I-Frame ,请找到以四个字节
000001B6
开头并具有下一个字节 00
的高两位的数据包。这将在具有简单视频对象类型的 MPEG4 流中找到 I 帧(不确定高级简单)。对于任何其他问题,您可以查看提供的文档(ISO IEC 14496-2),这里有您想了解的有关 MPEG4 的所有信息。 :)
关于rtp - 检测 RTP 流中的 MPEG4/H264 I-Frame (IDR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1957427/