H264参考帧

3

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

非常感谢您的帮助。

敬礼

Jacek


仍然应该存在IDR NAL单元。你是如何搜索的? - Roman R.
1个回答

8
H264帧通过特殊标记分割,称为startcode前缀,它可以是0x00 0x00 0x010x00 0x00 0x00 0x01。两个startcodes之间的所有数据都包含在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
由于3字节起始码与4字节起始码相同,只是少了一个字节,因此您实际上不需要单独处理这两种情况。第一个if语句将同时匹配这两种变体。 - Dennis Munsie
但是如果你只检查第一个字节,而你有4个字节的起始码,那么在起始码之前会留下一个0,这可能会使一些NAL数据包出现问题。 - Sergio Basurco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接