gpt4 book ai didi

rtp - 检测 RTP 流中的 MPEG4/H264 I-Frame (IDR)

转载 作者:行者123 更新时间:2023-12-03 10:36:36 32 4
gpt4 key购买 nike

我需要在 RTP 数据包中检测 MPEG4 I-Frame。我知道如何删除 RTP header 并在其中获取 MPEG4 帧,但我不知道如何识别 I 帧。

它有特定的签名/标题吗?

最佳答案

好的,所以我想出了 h264 流。

如何检测 I 帧:

  • 移除 RTP header
  • 检查 h264 有效载荷
  • 中第一个字节的值
  • 如果值为 124 (0x7C),则为 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)的简而言之:
  • VOP(视频对象平面——帧)以代码 000001B6(十六进制)开头。所有 MPEG4 帧 (I,P,B)
  • 都是一样的
  • 接下来是更多信息,我不打算在这里描述(参见 IEC 文档),但我们只(如 che 所说)需要来自以下字节的高 2 位(值 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/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com