2011-06-13 30 views
3

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

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

那是H264 NAL字节流?它是否以'0x00000167'开头? – Cipi 2011-06-25 12:27:35

回答

6

我严重不知道你的代码做什么(因为它被命名为h263parse),你问的是h264。

反正,H264帧都通过一个特殊的标记分裂,所谓的双起始码之间的起始码前缀,其是0×00 0×00 0×01 OR 0×00 0×00 0×00 0×01
所有的数据包括NAL单元在H264发言中提到。因此,可能你想要做的是在你的h264流中搜索startcode前缀,并在流中使用后续的NAL单元(直到下一个startcode前缀)。

像这样的东西可能:

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++; 
    } 
}