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