MP4ファイルフォーマットのデュレーションの確認方法

chakemiです。明日は大阪へ出張です。

先日、ハスキーボイスiyamaさんがActionScriptでデュレーションについて、書かれていたので その流れに乗って、本日は、mp4ファイルのデュレーションについてのメモ。

MP4は、QuickTimeファイルフォーマットをベースに仕様が策定されていて、box、box内にさらにboxと入れ子になったツリー構造で構成されています。もとになったQuickTimeではAtomと呼ばれてます。

内部構造を見るのに便利なツールがapple developerにあったのですが、現在は見つからなかったので 別で入手出来るURLを書いときます。 http://mirrors.vanadac.com/ftp.apple.com/developer/Quicktime/Windows_Tools/Programmers_Tools/Dumpster/

実際に内部構造を確認すると moov(Movie Resource Atom)ボックス内に、mvhd(Movie Header Atom)ボックスがあり、その中、もしくは同階層にVideoとAudioのそれぞれtrakブロックが分かれて存在し、それぞれのmdhdブロック内にTime scaleとDurationの情報が入ってます。

・Time scaleはフレームレートまたはサンプリング周波数 ※秒間をこの数値に分割したものを基準値
・Durationは上記サンプリング単位を元にした長さ

なので、以下のように計算してVideo、Audioの尺を算出できます。

Duration/Time scale = 尺(秒)

ビデオとオーディオではサンプリング周波数が違う為 必ず一致するわけではないですが、大抵が100分の1秒単位でのズレになります。

中にはエンコーダが原因なのか大きくズレてしまっているファイルなどがあり 実際に、ズレていたファイルのデータを参考に出すと

ビデオ
1
2
3
4
'mdhd'
Time scale:30000
Duration:50759589
50759589/30000=1691.9863秒
オーディオ
1
2
3
4
'mdhd'
Time scale:48000
Duration:81321515
81321515/48000=1694.1982秒

と2秒以上のズレが生じているものなどもあります。

こういったファイルをFlashMediaServerなどで配信する際にonMetaDataイベントやNetStream.timeプロパティなどでdurationを取得し、利用しようと思っても正しく動作しないかもしれません。

※正確にはmoovボックス直下のmvhdボックス内のTime scaleとDurationから取得しているかもしれませんがちゃんと調査しておりません。 どちらにしてもmvhdボックスの尺と、ビデオ、オーディオの尺がズレている場合、そのファイルは正常とは言えないでしょう。

対処方法としては、無理やり値を書き換えたり、mp4boxを使ったりと出来なくはなかったですが、 とりあえず再エンコードを行うのが確実かと思います。。。

Comments