MP4BoxでTimeScaleとDurationがおかしいmp4ファイルを修復する
ffmpeg(1年ほど前に試行錯誤でパッチを当てまくってビルドしたためバージョンは不明…)で下記オプションにてトランスコードしたファイルのTimeScaleとDulationが異常に大きな値になるという現象に遭遇しました。
ffmpeg -i target.m2p -f mp4 -vcodec h264 \ -deinterlace -r 29.97 -s 640x480 -b 720k \ -level 30 -qmin 12 -subq 6 -qmax 40 -g 250 \ -acodec aac -ac 2 -ab 128k -loop 1 target.mp4
プレイヤでは正常に再生することができるものの、異常に長いファイルだと認識されてしまい、時間外の場所にシークすると暴走してしまいます。
MP4Boxで調べてみるとビデオトラックのTimeScaleとDulationの値が非常に大きい値のファイルだということがわかりました。
* Movie Info * Timescale 1000 - Duration 00:30:28.971 Fragmented File no - 2 track(s) File Brand isom - version 512 File has no MPEG4 IOD/OD Track # 1 Info - TrackID 1 - TimeScale 29999970 - Duration 00:01:51.207 Media Info: Language "und" - Type "vide" - Sub Type "avc1" - 54821 samples MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21 AVC/H264 Video - Visual Size 640 x 480 Self-synchronized Track # 2 Info - TrackID 2 - TimeScale 48000 - Duration 00:30:28.970 Media Info: Language "und" - Type "soun" - Sub Type "mp4a" - 85733 samples MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40 MPEG-4 Audio AAC Main - 2 Channel(s) - SampleRate 48000 Synchronized on stream 1
再生はできることからビデオのデータ自体はほぼ正常そうなことがわかっているので、正しいFPSを指定してやればちゃんとしたファイルになりそうです。
ffmpegX版mp4boxのfps指定方法 ageha was hereを参考にして、映像と音声のトラックを分離し、分離したトラックを再結合する方法で修復を試みました。
メタデータはトラックを分離するとついてこないため、結合時に正常なメタデータが付加されることを期待します。
MP4Box -raw 1 target.mp4 MP4Box -raw 2 target.mp4
これで各トラックが分離されトラック番号とフォーマットに応じたファイルがトラック毎に出現します。(target_track1.h264やtarget_track2.aacなど)
MP4Box -fps 29.97 \ -add target_track1.h264 \ -add target_track2.aac \ -new target.new.mp4
FPSを明示して結合。これでちゃんとしたmp4ファイルが作成されました。ツギハギなffmpegを使っている僕の環境に限った問題なような気がしますが、似たようにトラブッっているmp4ファイルなら同様に修正できるはず。
参考までに修復後のトラック情報は以下になります。
* Movie Info * Timescale 1000 - Duration 00:30:29.196 Fragmented File no - 2 track(s) File Brand isom - version 512 File has no MPEG4 IOD/OD Track # 1 Info - TrackID 1 - TimeScale 2997 - Duration 00:30:29.195 Media Info: Language "und" - Type "vide" - Sub Type "avc1" - 54821 samples MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21 AVC/H264 Video - Visual Size 640 x 480 Self-synchronized Track # 2 Info - TrackID 2 - TimeScale 48000 - Duration 00:30:28.970 Media Info: Language "und" - Type "soun" - Sub Type "mp4a" - 85733 samples MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40 MPEG-4 Audio AAC LC - 2 Channel(s) - SampleRate 48000 Synchronized on stream 1