我有来自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;
}
答案 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++;
}
}