あるべるのIT関連メモ

素人エンジニアが何かするときに困ったものなどを参考程度にメモっておこうかと

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以下、残りの領域は自由に定義が可能。

実際のデータとコンテナの関係はこちら

albel06.hatenablog.com