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 |
|
1 2 3 4 |
|
と2秒以上のズレが生じているものなどもあります。
こういったファイルをFlashMediaServerなどで配信する際にonMetaDataイベントやNetStream.timeプロパティなどでdurationを取得し、利用しようと思っても正しく動作しないかもしれません。
※正確にはmoovボックス直下のmvhdボックス内のTime scaleとDurationから取得しているかもしれませんがちゃんと調査しておりません。 どちらにしてもmvhdボックスの尺と、ビデオ、オーディオの尺がズレている場合、そのファイルは正常とは言えないでしょう。
対処方法としては、無理やり値を書き換えたり、mp4boxを使ったりと出来なくはなかったですが、 とりあえず再エンコードを行うのが確実かと思います。。。