isogawaです。
MP4や、その派生である携帯電話向けの3GPP、3GPP2などのファイルフォーマットはボックス(あるいはその基になったQuickTimeでの用語のAtom)と呼ばれるデータブロックで構成されます。ボックスによってはその内部にさらにボックスが入れ子になるツリー構造になっています。
以下はNTTドコモの「MP4対応iモーション」ファイル(3GPP)の冒頭部分です(16進コードと文字が混在してて気持ち悪いあたりは気にしない)。
ADDR | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0000 | 00 | 00 | 00 | 1C | f | t | y | p | m | m | p | 4 | 00 | 00 | 00 | 01 |
0010 | m | m | p | 4 | 3 | g | p | 5 | 3 | g | p | 4 | 00 | 00 | 05 | 88 |
0020 | m | o | o | v | 00 | 00 | 00 | 6C | m | v | h | d | 00 | 00 | 00 | 00 |
各ボックスはその先頭8バイト(オクテット)がボックスを識別するためのヘッダで、最初の4バイト(オクテット)がボックスのサイズ、続く4バイトがそのタイプです。
上の例では先頭の4バイトが0x1Cなので、最初のボックスは0x00~0x1Bまで、続く4バイトの「ftyp」がそのタイプです。ftypボックスの中身は具体的なデータですが、続くmoovボックスは、さらにmvhdボックスを含む構成になっています(そして実際にはこの後さらに複数のボックスが入れ子になっています)。
+--ftyp +--moov | +--mvhd | +--drm | | +--dcmd | +--trak | | +--tkhd | | +--mdia | | +--(以下省略) | +--trak | | +--tkhd | | +--mdia | | +--(以下省略) | +--udta | +--titl +--mdat
このMP4対応iモーションファイルのボックス構造をツリー形式で表すとこんな感じですが、MP4ファイルフォーマットではある程度自由に任意のボックスを組み合わせることができるため、ファイルによってその構造はまちまちです。
The MP4 Registration Authorityに登録されているボックスの一覧は以下で参照できますが、これ以外のボックスが存在している場合もあります。
主要なボックスには、、ファイル種別を示すftyp、動画や音声の実際のデータを格納したmdat、各種メタデータを格納したさまざまなボックスのコンテナ(入れ子の親)であるmoovなどがあります。
ftyp
ftypボックスには、そのファイルが準拠している規格を表す4文字の「ブランド」が列挙されます。タイプ名の「ftyp」の直後に続く4文字は「(The major or ‘best use’) Brand」で、そこから4バイト空けて、以降ボックスの最後までの文字列を4文字ごとに区切ったそれぞれが「Compatible Brand」です。
上のMP4対応iモーションの例ではこれは以下のようになります。
- Major Brand: mmp4
- Compatible Brand #1: mmp4
- Compatible Brand #2: 3gp5
- Compatible Brand #3: 3gp4
プレイヤーによってはこの内容で再生の可否を判断しており、この内容を書き換えることで、本来は再生対象ではないファイルを再生する手法はあちこちで見かけます。
-
Complete List of all known MP4/QT 'ftyp' designations
著名なコーデック判別ツールGSpotの作者Steve Greenberg氏による、(氏にとって)既知のブランドの一覧。
ハードウェアベンダーはこれらのブランドに独自の値を採用しているケースが多々あり、そのようなケースではブランドだけで、それがどの機器用のファイルであるか判別できます。例えば、NTTドコモのMP4対応iモーションは「mmp4」、auのEZムービーは「kddi」、ソニーのPSPは「MSNV」といった値をそれぞれMajor Brandに採用しています(ソフトバンクモバイルの場合、Compatible Brandに「vfj1」という値が含まれるようです)。
moof
3GPPと比較した3GPP2の特徴のひとつに「ムービーフラグメント」があります。これはHTTPストリーミングを想定したもので、文字通りデータを分割し小分けに受信することで、全データのダウンロードを完了しなくても再生が開始できるというものですが、これはファイルフォーマット的には、以下の図にみられるように、moofボックスによって実現されています。
ちなみにauのEZムービーでは最大15秒ごとに分割されますが、ムービーフラグメントに対応していないプレイヤーでは最初の15秒しか再生されなかったりします。
ボックス構造を表示するツール(for Linux)
MP4Box
オープンソースのマルチメディアフレームワークGPACに付属するコマンドラインアプリケーションです。ボックス構造の表示は以下のような感じ。
$ mp4box -std -diso hoge.3gp
<?xml version="1.0" encoding="UTF-8"?>
<!--MP4Box dump trace-->
<IsoMediaFile Name="hoge.3gp">
<FileTypeBox MajorBrand="mmp4" MinorVersion="1">
<BoxInfo Size="28" Type="ftyp"/>
<BrandEntry AlternateBrand="mmp4"/>
<BrandEntry AlternateBrand="3gp5"/>
<BrandEntry AlternateBrand="3gp4"/>
</FileTypeBox>
<MovieBox>
<BoxInfo Size="1416" Type="moov"/>
<MovieHeaderBox CreationTime="-1023342072" ModificationTime="-1023342067" TimeScale="60000" Duration="282000" NextTrackID="3">
<BoxInfo Size="108" Type="mvhd"/>
<FullBoxInfo Version="0" Flags="0"/>
</MovieHeaderBox><TrackBox>
(以下省略)
mp4dump
オープンソースのストリーミングサービス構築パッケージMPEG4IPに付属するコマンドラインアプリケーションです。ボックス構造の表示は以下のような感じ。
$ mp4dump hoge.3gp
Dumping hoge.3gp meta-information...
type ftyp
majorBrand = mmp4
minorVersion = 1 (0x00000001)
<table entries suppressed>
type moov
type mvhd
version = 0 (0x00)
flags = 0 (0x000000)
creationTime = 3271625224 (0xc3010a08)
modificationTime = 3271625229 (0xc3010a0d)
timeScale = 60000 (0x0000ea60)
duration = 282000 (0x00044d90)
rate = 1.000000
volume = 1.000000
(以下省略)
getID3()
MPEG-4に限らずさまざまなメディアファイルのメタデータを気合いで抽出するPHP用クラスライブラリです。デモページで動作イメージを確認できます。
uuidボックスの解析
ボックスによっては、その中身の仕様が一般には公開されていないものがありますが、特にベンダーが独自の拡張を施すために用意されたuuidボックスの中身は、当然ベンダーごとに異なります。こうしたボックスはこれまでにもさまざまな解析が試みられてきました。以下はauのEZムービーやPSP動画のuuidを解析した先達の例です。
しかし、特にEZムービーについては某巨大掲示板のスレにもっとも情報が集約されているかもしれません…。