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

标签 rtp rtsp

我需要在 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/

    相关文章:

    voip - 如何计算RTP中的有效时间偏移量

    gstreamer - gstreamer gst-rtsp-server 是否接受 udpsrc (RTP)?

    c - Qt Creator 中的 Gstreamer rtsp 服务器链接

    FFmpeg 命令行 CPU 使用率与代码 CPU 使用率

    c# - 如何使用 VLC 插件获取缓冲视频的状态并修复 c# 中视频播放器中的自定义 Logo

    android - 通过 rtp 流发送 Android h264 捕获

    python - 如何发起SIP( session 发起协议(protocol))并通过RTP(实时传输协议(protocol))传输媒体(语音)

    c# - WPF RTP 流

    c++ - 使用 Ffmpeg 传输 SEI

    ffmpeg 转换突然停止