如何通过一些特殊标签来区分H264编码的视频帧?

时间:2011-06-13 16:13:44

标签: android h.264

我有来自Android移动相机的H264编码视频文件,我想获取帧并将它们作为文件逐个存储。问题是,我如何区分帧,通过一些特殊标签分割帧?现在我有了这个函数可以得到帧长度的字节,也许它有助于理解我的问题,Thx:)

  public static int h263Parse(byte[]buf, int offset, int nLen)
{
            int vop_found, i;          
    vop_found = 0;        
    i=0;
    if(vop_found == 0)
        {
        for(i=(offset + 3); i<(offset+nLen); i++)
                {
            if(buf[i-3] == 0x00)
                    if(buf[i-2] ==  0x00)
                            if((buf[i-1]&0xff) < 0x84)
                                    if((buf[i-1]&0xff) >= 0x80)
                        {
                i++;
                vop_found=1;
                break;
            }
        }
    }

    if(vop_found == 1)
        {
        for(; i<(offset+nLen); i++)
                {
                if(buf[i-3] == 0x00)
                    if(buf[i-2] ==  0x00)
                            if((buf[i-1]&0xff) < 0x84)
                                    if((buf[i-1]&0xff) >= 0x80)
                        {
                return i-3-offset;
            }
        }
    }
    return -1;
}

1 个答案:

答案 0 :(得分:6)

我真的不知道你的代码在做什么(因为它名为 h263parse ),你问的是h264。

无论如何,H264帧会被称为起始码前缀的特殊标记分割,该标记为 0x00 0x00 0x01 0x00 0x00 0x00 0x01
两个起始码之间的所有数据包括H264中的 NAL单位。因此,您可能想要做的是在h264流中搜索起始码前缀,并对流中的NAL单元(直到下一个起始码前缀)执行某些操作。

或许这样的事情:

void h264parse_and_process(char *buf)
{
    while(1)
    {
        if (buf[0]==0x00 && buf[1]==0x00 && buf[2]==0x01)
        {
            // Found a NAL unit with 3-byte startcode, do something with it
            do_something(buf); // May be write to a file
            break;
        }
        else if (buf[0]==0x00 && buf[1]==0x00 && buf[2]==0x00 && buf[3]==0x01)
        {
            // Found a NAL unit with 4-byte startcode, do something with it
            do_something(buf); // May be write to a file
            break;
        }
        buf++;
    }
}