Parsing h264参考框架

Parsing h264参考框架,parsing,h.264,decoding,Parsing,H.264,Decoding,我正在寻找一种在h264流中查找参考帧的算法。我在不同的解决方案中看到的最常见的方法是查找IDR类型的访问单元分隔符和NAL。不幸的是,我检查的大多数流没有IDR类型的NAL。 我将非常感激你的帮助。 当做 JacekH264帧由一个称为startcode前缀的特殊标记分割,该标记可以是0x00 0x00 0x01或0x00 0x00 0x01。两个STARTCODE之间的所有数据都包含H264中的NAL单元。因此,您要做的是在h264流中搜索startcode前缀。startcode前缀后面紧

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

H264帧由一个称为startcode前缀的特殊标记分割,该标记可以是0x00 0x00 0x010x00 0x00 0x01。两个STARTCODE之间的所有数据都包含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++;
    }
}

仍然
IDR
NAL单位应该在那里。您是如何搜索的?因为3字节的起始代码与4字节的起始代码相同,但只少了一个字节,所以您真的不需要分别处理这两种情况。第一个if将找到两个变量。但是如果只检查第一个变量,并且有4字节的开始代码,那么在开始代码之前会留下一个0,这可能会弄脏一些nal数据包。