2011-04-09 81 views
2

我想知道什麼是開始代碼以及如何在H 264編解碼器中查找i幀。基本上,我試圖使用Java加密視頻文件,如果有人解釋我如何解析視頻,文件來獲得使用Java的i幀?任何人都可以請回答。 感謝提前。什麼是H 264編解碼器中i幀的起始碼?

+0

的可能重複[如何解碼在Java環境中的H.264視頻幀(http://stackoverflow.com/questions/2165593/how-to-decode-h-264-video-frame-in-java-環境) – 2011-04-09 07:30:20

回答

1

如果流爲Annex-B格式,那麼可以在NAL單元之後查找等於0x000001的「起始碼前綴」。 NALU類型信息在第一個字節中提供。

3

上一個答案指的是nal_unit()中的nal_unit_type字段。 nal_unit的詳細語法見ISO 14496-10的7.3.1節()。

H.264和MPEG 2的不同之處在於H.264區分了I切片和IDR。 I切片本身可以被解碼成完整的圖像,但是之後解碼的切片有可能在I之前參考切片。第3.62節陳述「在解碼IDR圖像之後,解碼順序中的所有後續編碼圖像可以被解碼來自在IDR圖片之前解碼的任何圖片的預先解讀「。這就像一個MPEG 2封閉的GOP。返回nal_unit_type,請參閱表7-1,它表明IDR具有nal_unit_type 5,但如果您要查找I切片,則可以查看access_unit_delimiter()中的primary_pic_type(表7-5)(其中,部分7.3.2.4),或者你可以檢查slice_header的slice_type(表7-6)()(見第7.3.3節)

3

基於上述這裏的評論是一個簡單的代碼片段,您可以使用:

ByteBuffer bb = ... // Byte buffer with your frame or h.264 NAL stream 

int marker = 0xffffffff; 
while (bb.hasRemaining()) { 
    int b = bb.get() & 0xff; 
    if (marker == 1) { 
     if ((b & 0x1f) == 5) 
      System.out.println("IDR slice!! " + (bb.position() - 1)); 
    } 
    marker = (marker << 8) | b; 
} 

如果你只是想知道一個給定的幀是否是一個IDR片(關鍵幀),你可以使用來自JCodec的H264Utils.idrSlice(http://jcodec.org):

ByteBuffer bb = ... // Byte buffer with your frame or h.264 NAL stream 
if(H264Utils.idrSlice(bb)) 
    System.out.println("IDR slice!!"); 

你想使用的庫的原因是因爲IDR NAL單元片不是在編碼幀中攜帶的只有一片,所以你將不得不通過SPS,PPS和SEI的序列來獲得,最終得到到您的IDR切片。

+0

我能找到的第一個正確答案:) – 2013-08-21 13:10:35