MP4(コンテナ) - 1.Box構造
出自
Apple QuickTime format (mov) を元にISO/IEC 14496-1が策定され のちにISOベースメディアファイルフォーマットとしてISO/IEC 14496-12を策定。 MP4はそれを元に拡張しISO/IEC 14496-14 (Part 14: MP4 file format)で標準化された。
Box構造
MP4はBoxという要素からなる木構造を持つ。元になったmovではAtomと言われている。 Boxは先頭の4byteで自身のサイズを、続く4byteでBox Typeを表す。
aligned(8) class Box (unsigned int(32) box type, optional unsigned int(8)[16] extended_type) { unsigned int(32) size; unsigned int(32) type = boxtype; if (size == 1) { unsigned int(64) largesize; } else if (size == 0) { // box extends to end of file } if (boxtype == 'uuid') { unsigned int(8)[16] usertype = extended_type; } }
代表的なBoxとして
moov: メタデータを格納
mdat: 動画や音声などの実データを格納
がある。
4GB超えファイルの扱い
最近では4K動画やハイフレームレートの動画などビットレートの高い動画が増え、4GBを超える動画が記録されるようになっている。
動画のデータは'mdat'というBoxに書かれるのだが、上述のBoxの先頭に記録できるsizeは32bit分で4GBを超えると足りない。
そのときのためにextended sizeというものが用意されていて、Boxの先頭に記録するsizeを1(*)とし、typeのあとに64bit符号無し整数としてlargesize=Boxサイズを記録できるようになっている。
(*)size=1のBoxは存在できない。Boxは最低でもsize+typeで8byte以上ある。
Full Box
Boxを拡張してバージョン番号とflagフィールドを追加したFull Boxというものがあり、実際に各種データを保存するBoxはFull Boxであることが多い様子。
バージョン番号とflagフィールドの意味は各Boxの仕様に記載されている。
aligned(8) class FullBox(unsigned int(32) boxtype, unsigned int(8) v, bit(24) f) extends Box(boxtype) { unsigned int(8) version = v; bit(24) flags = f; }
ユーザー定義Box
Boxの定義にはoptionalでextended_typeというものがあり、ユーザーがuuidを設定することでユニークなユーザー定義Boxを使用することができる。そのときのBoxタイプは'uuid'とし、typeの後ろに16byteのuuidを記録する。uuid Box以下、残りの領域は自由に定義が可能。