2013年12月19日木曜日

MPEG4コンテナのmoovボックスについて

boxtype:moov
必須フィールドであり、どんなデータがファイル中にどのように格納されているかを示すMPEG4コンテナ中で最も重要なボックスである。
MPEG2においてPAT→PMT→データと辿るように、MPEG4ではここからデータまで辿ることになる。

mdatボックス(動画データや音声データが格納されるボックス)の説明書のような役割をしておりmdatボックスの後に配置される事が多いようだ。
(データを一旦配置してみて、その後にオフセットを書いていくという処理がエンコーダーにとって都合がよいからだろう。)
仕様としてmdatボックスとの順序が規定されているわけではない。

moovボックスには階層の深い子ボックスがたくさんあり、他に比べれば少し複雑なツリーを構成する。ツリー構造は下記のようになる。
 moov(*)
├─mvhd(*)
├─trak(*)
│  ├─tkhd(*)
│  ├─tref
│  ├─edts
│  │  └─elst
│  └─mdia(*)
│      ├─mdhd(*)
│      ├─hdlr(*)
│      └─minf(*)
│           ├─vmhd
│           ├─smhd
│           ├─hmhd
│           ├─nmhd
│           ├─dinf(*)
│           │   └─dref(*)
│           └─stbl(*)
│                ├─stsd(*)
│                ├─stts(*)
│                ├─ctts
│                ├─stsc
│                ├─stsz
│                ├─stz2
│                ├─stco(*)
│                ├─co64
│                ├─stss
│                ├─stsh
│                ├─padb
│                ├─stdp
│                ├─sdtp
│                ├─sbgp
│                ├─sgpd
│                └─subs
├─mvex
│  ├─mehd
│  └─trex(*)
└─ipmc
trakボックスは複数定義することができる。通常は動画と音声一つずつの2トラックだろうが多国語音声など複数持たせても良い。
(*)を付けているのは必須ボックスである。

このエントリでは子階層ボックスの一つずつまでは説明しきれないが、重要なのはstbl以下の階層である。ここがmdatボックスの構造を定義する部分だからだ。
動画と音声を同期させるための時刻情報もここに含まれている。

moov/mvex/trexが仕様上は必須となっているがTMPGEncで出力したファイルを見ると付いていなかった。少し調べただけでは何故か分からなかったが必須ではないのが正しい気がする。
(親ボックスのmvexが必須とされていないのが説明できないので。見てる仕様書が古いのかな・・・)

moov子階層のボックスの順序はmust指定ではないがstrongly recommendでヘッダ類が最初に来るようにとされてるのでmvhdが先頭に来るだろう。
(mustじゃダメなのかな・・・recommendだと実装が面倒なんだけど)

0 件のコメント:

コメントを投稿