2011-06-13 29 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++; 
    } 
}