2013年12月19日木曜日

MP4コンテナの中身を調べる

ISO/IEC 13818-1で定義される動画コンテナとしてのMPEG2はよく普及しており
日本語での資料も充実しているがISO/IEC 14496-14で定義されるMPEG4 Part14 コンテナは
情報が多いとは言えない。私もよく知らない。

そもそもはAppleのQuickTimeフォーマットがベースになっているMPEG4 Part12が
元に拡張したものであるらしい。Part14の仕様書はPart12からの拡張部分しか書いてない。
だからPart14の仕様書の前にPart12の仕様書を見ないと訳が分からない。
そもそもPart14での拡張部分なんぞ大半の人は使用しておらず
Part12互換のファイルを作っているんじゃなかろうか。
(調べ始めたばかりで適当な事言ってるので注意)

動画コンテナとしての役割は大きくは2つあると思う。
ストリーミングに関してはひとまず置いておく。
  1. 映像と音声をズレないよう同期させる
  2. ランダムアクセスを可能にする
 1.に関してMPEG2ではDTS、PTS、PCRといったタイムスタンプ情報が充実しており同期に関してこれを越えるフォーマットは存在しないと思われる。MPEG4ではDT(Decoding Time)、CT(Composition Time)というものがそれらに相当する。

2.に関してMPEG2システムでは上記時刻情報を元にシークするしかない。ファイルのお尻のほうのPCRから全体の時間を求め、ファイルポインタを大雑把に進めてから細かい探索を行う。大した処理ではないが非力な組み込み機器では問題になるかもしれない。MPEG4では基本的にオフセット情報で管理されているため直接目的の位置に飛べそうだ。実際に負荷がどれくらい減るのかは知らないが。

MP4コンテナにおける構成を最も大雑把な単位で書くと次のようになる。
その他のデータは読み飛ばしても問題ないようなゴミデータばかりだが先頭にftypボックスが存在することは必須とされている。
ftypも再生に必要なわけではないが多機能すぎるMPEG4システムの内、どこまでを使ったものなのか知るには意味があるかもしれない。
  • moovボックス(メタデータ)
  • mdatボックス(動画・音声データ)
mdatはMedia Dataを指すが、この中には動画・音声データを比較的自由に格納できる。mdatにどのようにデータを格納したかをmoovボックスに記述することで最終的にはアクセスできるようになる。よって動画データ丸ごとの後に音声データを丸ごと繋げる単純な構造でも良いし、それぞれを細切れにして交互に配置しても構わない。

MPEG4の内部を解析するツールとしてWindowsではMP4 Readerが最も便利だった。
下図はTMPGEnc 5から出力したMPEG4(H.264,LC-AAC)ファイルの解析結果である。

moovボックスの下に2つのtrakボックスがあるのが分かる。それぞれが動画と音声トラックを示している。moovボックス直下にmvhdボックスがあり、図の右側に出ているがここにファイル全体の時間の長さが書いてある。一分の長さのコンテンツなのでduration=60714(ミリ秒)と出ている。こんなに浅い場所を調べるだけで長さが分かるのはMPEG2から比べれば格段に楽だ。MPEG2ではファイルの先頭と最後のタイムスタンプの差分から推測するしかなかった。タイムスタンプは27MHz周期で24時間弱程度で一周してしまう点もやっかいだった。MPEG2-PSはMPEG2-TSとの互換性の問題で長さのフィールドが無いのかもしれないが。

再生にあたって重要な情報はstts/ctts/stsc/stsz/stcoだ。これらがmdatボックスのどの位置に何の情報が書かれているかと時刻情報が書かれている。時刻情報といってもMPEG2のように基準時刻からの経過時間が書かれているのではなく前フレームからのオフセット時間だけが書かれているようだ。sttsがDecode Timeのテーブルになるが、このファイルの場合は「全フレームの間隔は2000」と書いていただけだった。可変フレームレートだともっとややこしい表になるかもしれない。
cttsはフレームの並び替えの問題もあると思うのだがもっと複雑だった。

とりあえず今回はここまで。
機能てんこもりにした挙句に一部しか使われてないから
わざわざMPEG2システムから乗り換えるほどのメリットがあるかは疑問だ。
地デジにしてもAVCHDにしてもMPEG2-TSなのは互換性の問題だけではないだろう。

0 件のコメント:

コメントを投稿