问题描述
|
我有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++;
}
}