2013年7月31日水曜日

h264についてメモ書き

正しくない可能性がありますので、h.264について知る上での手がかり程度にしてください。

■構造について
まずはnal構造
nal構造というのは、次のような形になっています。
00 00 01 [h264のフレームデータ] 00 00 01 [h264の別のデータ]・・・
mpegtsの中身とかはコレになっています。

その他の構造もあります。
[4バイトでフレームデータサイズ] [h264のフレームデータ][4バイトのサイズ][h264...]・・・
flvやmp4はこちら側になっているみたいです。

その他の構造があるってことを知っておかないと混乱します。

■フレームデータについて
とりあえず1バイト目をみれば、どういうデータであるか知ることができます。
bitにすると
ABBC CCCC
という形になっていて
Aは0固定
Bは数値が大きいほど変換に必要なデータ、0の場合はなくてもいいデータ
Cの部分はフレームタイプになっています。
↓ボクのプログラムでつかっている定義はこんな感じ
https://github.com/taktod/myLib/blob/master/myLib.media.h264/src/main/java/com/ttProject/media/h264/Type.java

とりあえず、以下のデータを押さえてあります。
0x01:slice いわゆるinnerFrame、High Profileのファイルをみたら、優先度が0になっているデータがあってびっくりした。
0x05:sliceIDR いわゆるkeyFrame
0x07:sequenceParameterSet 略すとsps
0x08:pictureParameterSet 略すとpps spsとppsを合わせたデータがflvではmediaSequenceHeaderとなっています。mp4ならavcCのタグの中身がこの2つ合わせた物になっている。
0x09:accessUnitDelimiter 単なる区切りです。もちろん優先度は0

とりあえずこんなことになっているらしいです。