2013-01-07 52 views
1

我從H.264流創建MPEG-4文件。 H.264流採用NAL格式(EG:0,0,0,1,67,...,0,0,1,68,...)。每個視頻幀以多個I幀/ P幀片段傳輸。例如:第1幀包含大約80個I幀片段,第2幀包含大約10個P幀片段。從I幀/ P幀片段創建MDAT

據我所知,MPEG-4文件的MDAT原子應該包含NAL格式的H.264流。

我想知道在將這些片段放入MPEG-4的MDAT原子之前,如何將這些片段轉換爲單個I幀。

我不想使用任何庫。

感謝您的幫助。

回答

0

您將要將H.264 Annex B NAL流轉換爲MP4文件包。爲了做到這一點,您需要:

  • 將您的原始文件拆分爲NAL單元(00 00 00 01 yy xx xx ...);
  • 定位幀邊界:每個H.264幀通常包含多個片,並且可以選擇其中的一個:SPS,PPS,SEI。您需要解析上面的'yy'八位字節以確定您正在查看的是哪種NAL單元。現在,爲了瞭解幀的邊界,您需要解析每個片的第一部分,稱爲'SliceHeader',並比較連續片的'frame_number'。
  • 只要知道幀邊界,就可以形成MP4數據包。每個數據包將僅包含一個框架和和NAL單元的格式如下:

    L1 L1 L1 L1 YY xx月xx ...
    L2 L2 L2 L2 YY xx月xx ...

所以基本上用整數保存這個NAL單元的長度來替換每個分隔符'00 00 00 01'。

  • 然後,爲了獲得正確的MP4標題,您需要使用MP4複用器並在視頻軌道的示例條目中填充正確的'AvcC'原子。

這是一個非常繁瑣的過程,但如果你想進入細節你可以學習JCodec(http://jcodec.org)的源代碼:org.jcodec.samples.transcode.TranscodeMain,org.jcodec.containers.mp4。 MP4Muxer