【问题标题】:h264 reference framesh264 参考帧
【发布时间】:2012-06-12 08:58:57
【问题描述】:

我正在寻找一种在 h264 流中查找参考帧的算法。我在不同的解决方案中看到的最常见的方法是查找访问单元分隔符和 IDR 类型的 NAL。不幸的是,我检查的大多数流都没有 IDR 类型的 NAL。 我将不胜感激。 问候 杰克

【问题讨论】:

  • 仍然应该有IDR NAL 单元。你是怎么搜索的?

标签: parsing h.264 decoding


【解决方案1】:

H264 帧由一个特殊的标签分割,称为起始码前缀,它可以是 0x00 0x00 0x010x00 0x00 0x00 0x01。两个起始码之间的所有数据都包含在 H264 语音中的一个 NAL 单元。所以你要做的是在你的 h264 流中搜索 startcode 前缀。紧跟在 startcode 前缀后面的字节是 NAL 标头。 NAL 标头的最低 5 位将为您提供 NAL 单元类型。如果 nal_unit_type = 5,则该特定 NAL 单元是参考帧。

类似这样的:

void h264_find_IDR_frame(char *buf)
{
    while(1)
    {
        if (buf[0]==0x00 && buf[1]==0x00 && buf[2]==0x01)
        {
            // Found a NAL unit with 3-byte startcode
            if(buf[3] & 0x1F == 0x5)
            {
                // Found a reference frame, do something with it
            }
            break;
        }
        else if (buf[0]==0x00 && buf[1]==0x00 && buf[2]==0x00 && buf[3]==0x01)
        {
            // Found a NAL unit with 4-byte startcode
            if(buf[4] & 0x1F == 0x5)
            {
                // Found a reference frame, do something with it
            }
            break;
        }
        buf++;
    }
}

【讨论】:

  • 由于 3 字节起始码与 4 字节起始码相同,只是少了一个字节,因此您真的不需要分别处理这两种情况。第一个 if 将找到两个变体。
  • 但是如果你只检查第一个并且你有 4 字节的起始码,你会在起始码之前留下一个 0,这可能会弄脏一些最终数据包。
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2015-12-30
  • 2017-09-10
  • 2014-02-06
相关资源
最近更新 更多