この記事でわかること

  • moov atom not found エラーの意味と原因
  • MP4ファイルの moov / mdat 構造の基礎
  • -movflags faststart で問題を予防する方法
  • 録画途中で終了したファイルの修復方法
  • qt-faststart ツールの使い方

テスト済みバージョン: FFmpeg 6.1
対象 OS: Windows / macOS / Linux


moov atom not found とは

MP4ファイルは複数の「atom(アトム)」または「box(ボックス)」と呼ばれる構造ブロックで構成されています。その中でも特に重要なのが:

  • mdat(Media Data atom):実際の動画・音声データ
  • moov(Movie atom):ファイルのインデックス情報(タイムスタンプ、サンプル位置など)

moov がないと、プレーヤーもFFmpegもファイルを再生・処理できません。

エラー例:
moov atom not found
Invalid data found when processing input

なぜ moov がファイル末尾にあるのか

FFmpegはデフォルトでエンコード完了後に moov をファイル末尾に書き込みます。理由はエンコード中は mdat のサイズが不明なため、moov の内容(各フレームのオフセット情報)が確定できないからです。

[デフォルト構造]
ftyp | mdat(巨大な映像・音声データ) | moov(インデックス)

この構造は2つの問題を引き起こします:

  1. プログレッシブダウンロード不可:ブラウザがファイル全体をダウンロードするまで再生できない
  2. 録画クラッシュ時moov が書き込まれる前にプロセスが終了すると moov が存在しない壊れたファイルになる

予防策:-movflags faststart

新しくMP4を作成する場合は -movflags faststart を使うと moov をファイル先頭に移動できます:

ffmpeg -i input.mp4 -c copy -movflags faststart output_fast.mp4

これにより moov がファイル先頭に配置され、ストリーミング再生やWebでの早期表示が可能になります。

[faststart構造]
ftyp | moov(インデックス) | mdat(映像・音声データ)

エンコード時に faststart を指定する

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -movflags faststart output.mp4

qt-faststart で既存ファイルを最適化

FFmpegに付属する qt-faststart ツールで既存のMP4を変換できます:

qt-faststart input.mp4 output_fast.mp4

qt-faststart はファイルを再エンコードせず、moov を先頭に移動するだけです(高速・無劣化)。


録画クラッシュで壊れたファイルの修復

録画中にクラッシュしたファイル(moov なし)は FFmpeg 単体では修復できません。以下のツールが有効です。

untruncate(mp4fragmentsが必要)

mp4recovery input_broken.mp4 output_recovered.mp4

recover_mp4 スクリプト

FFmpegのソースコードに含まれる tools/recover_mp4.c をコンパイルして使う方法もあります。

商用ツール

  • Remo Video Repair
  • Stellar Video Repair

-frag_duration でMP4をフラグメント化して耐クラッシュ性を上げる

録画用途では、こまめに moov を更新するフラグメント化MP4が有効です:

ffmpeg -i input.mp4 -c copy -movflags frag_keyframe+empty_moov+default_base_moof output_frag.mp4
  • frag_keyframe:各キーフレームでフラグメントを作成
  • empty_moov:ファイル先頭に空の moov を配置
  • default_base_moof:標準のbase mediaフラグメント

このフォーマットはMP4の途中でクラッシュしても部分的に再生可能です(HLS/DASHに近い構造)。


MP4のatom構造を確認する方法

ffprobe でatom構造を調べられます:

ffprobe -v trace -i input.mp4 2>&1 | grep -E "^(ftyp|moov|mdat)"

よくある質問

Q: moov atom not found のファイルを再エンコードできないか?

できません。moov がなければFFmpegはファイルのどこにフレームがあるかわからないため、読み込み自体が失敗します。修復ツールを先に使う必要があります。

Q: -movflags faststart は常に使うべきか?

Web/ストリーミング用途では推奨です。ローカル再生専用なら不要です。ただし録画用途では frag_keyframe+empty_moov の方が耐クラッシュ性に優れています。

Q: faststart の処理時間は?

ファイルの再エンコードは行わないため非常に高速です(数秒以内)。


関連記事


一次ソース: ffmpeg.org/ffmpeg-formats.html#mp4 / trac.ffmpeg.org/wiki/Seeking