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

| 我有H264编码的视频文件,来自Android移动摄像头,我想获取帧并将其一一存储为文件。问题是,如何区分框架,框架是否被某些特殊标签分开?现在我有了此功能,可以按字节获取帧长度,也许有助于理解我的问题,谢谢:)
  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;
}
    
已邀请:
        我严重不知道您的代码在做什么(因为它名为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++;
    }
}
    

要回复问题请先登录注册