h264参考帧

use*_*190 3 parsing decoding h.264

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

puf*_*der 8

H264帧由一个特殊标记分隔,称为起始码前缀,可以是0x00 0x00 0x010x00 0x00 0x00 0x01.两个起始码之间的所有数据包括H264中的NAL单元.所以你想要做的是在你的h264流中搜索起始码前缀.紧接着起始码前缀的字节是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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 由于3字节起始码与4字节起始码相同,但只有少一个字节,因此您实际上不需要单独处理这两种情况.第一个if会找到两个变种. (3认同)