FFmpegにファイルを指定すると、即座に Invalid data found when processing input で止まり、何も変換されない——このエラーは、FFmpegがファイルを開けたものの中身を解釈できなかったことを意味します。つまり、バイト列がコンテナの主張する形式と一致していないのです。幸いなことに、原因は短いリストにまとまっており、順に潰していけます。まずファイルが実際に何なのかを確認し、次に最も無害な修復を試し、それでもダメなときだけ再エンコードします。

動作確認: ffmpeg 8.1 で確認済み


この記事でわかること

  • Invalid data found when processing input の典型的な4つの原因
  • 手を付ける前に ffprobe でファイルの正体を確認する方法
  • エラー許容で再multiplexし、少し壊れたファイルを救う方法
  • +genpts で不完全なファイルの欠けたタイムスタンプを修復する方法
  • コピーを諦めて再エンコードに切り替える判断のタイミング

エラーは入力を指しているので、調査もそこから始めます。多くの場合、ファイルは途中で切れている・ラベルが間違っている・ダウンロードが途中までしか終わっていない、のいずれかで、どれに当たっているかが分かれば、ある程度まで復旧できます。


よくある原因

Invalid data found when processing input は、FFmpegが「ヘッダ(の一部)を読んだが辻褄が合わない」と言っている状態です。代表的な容疑者は次の通りです。

  • 途中で切れた・不完全なダウンロード — ダウンロードやコピーが中断され、ファイルが不完全。末尾が欠けているため、moov atom(MP4の場合)やインデックスが届いていない。
  • そもそもメディアファイルでない — 例: .mp4 として保存されたHTMLのエラーページや不完全なダウンロードなど、メディアでないデータ。FFmpegは名前ではなくバイト列を読むため、正しいファイルなら拡張子が違っても(本物の .webm.mp4 と名付けても)問題なく開けます。このエラーになるのは、バイト列がそもそも使えるメディアコンテナでない(または非対応・破損している)場合だけです。正しいファイルの拡張子違いはメディアプレーヤー側の問題で、FFmpegの問題ではありません。
  • 実際の破損 — 不良ディスク、不安定な転送、失敗した録画などでバイトが化けたり欠落したりした。
  • 非対応・特殊なコンテナ — 使っているFFmpegビルドがdemuxできるようにコンパイルされていない稀な形式。

原因が何であれ修復の道筋は同じです。正体を特定し、まず最も安価な修復から試します。


手順1: ファイルの正体を確認する

修復の前に ffprobe を実行します。FFmpegが検出した実際のコンテナとストリームを報告してくれるので、ファイルが思っている形式かどうかがすぐ分かります。

ffprobe input.mp4

出力の最初の数行を注意深く読みます。

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4':
  Duration: 00:01:23.45, start: 0.000000, bitrate: 1536 kb/s
  Stream #0:0: Video: h264 (High), yuv420p, 1280x720, 30 fps
  Stream #0:1: Audio: aac, 44100 Hz, stereo

ffprobe 自体が Invalid data found を出す場合は、バイト列が破損・不完全・非対応、またはそもそもメディアでない、というのが本当の原因です。一方、ffprobe が拡張子と違うだけの正しい形式を検出した場合(たとえば .mp4 という名前に Input #0, matroska,webm)は、FFmpeg はすでに読めています——.mp4 として保存された本物の .webm も問題なく開けます。ffprobe が報告する形式(例: input.webm)へのリネームは、分かりやすさとプレーヤー互換性のためであって、FFmpeg が読めるようにするためではありません。

ffprobe がまともなDurationとストリームを報告するのに、変換の途中でFFmpegがエラーを出す場合は、ファイルがわずかに破損しているか途中で切れている可能性が高いので、手順2へ進みます。


手順2: エラー許容で再multiplexする

ストリームが本質的には正常で、ファイルにゴミが少し混じっているだけなら、正常なパケットだけを新しいコンテナへそのままコピーできることがよくあります。-c copy で再エンコードを避け(高速・無劣化)、-err_detect ignore_err で軽微なエラーを中断せず押し通すよう指示します。

ffmpeg -err_detect ignore_err -i input.mp4 -c copy output.mp4
  • -err_detect ignore_err — 回復可能なエラーに当たっても処理を続行
  • -c copy — 全ストリームを再エンコードせずにコピー
  • 新しいファイルへ出力 — インデックスを作り直したきれいなコンテナ

これは救えるパケットからコンテナを書き直します。破損がインデックスの破壊や末尾のゴミだけだった場合、新しい output.mp4 は問題なく再生できることがよくあります。コピーなので画質の劣化はなく、数秒で済みます。


手順3: 不完全なファイルのタイムスタンプを作り直す

ダウンロードが途中で切れたファイルは、表示タイムスタンプ(PTS)が欠けていたり壊れていたりすることが多く、処理中に invalid-data や「non-monotonous DTS」エラーとして表面化します。-fflags +genpts フラグは、欠けている表示タイムスタンプを生成するようFFmpegに指示します。

ffmpeg -fflags +genpts -i input.mp4 -c copy output.mp4
  • -fflags +genpts — 欠けている表示タイムスタンプを生成
  • -c copy — 再エンコードはしない

映像データはあるのにタイミングのメタデータが不完全な、途中までの録画や中断したダウンロードに適した手です。1つのフラグでは足りないときは、手順2のエラー許容と組み合わせられます: ffmpeg -err_detect ignore_err -fflags +genpts -i input.mp4 -c copy output.mp4


手順4: 最終手段の再エンコード

コピーが失敗する場合——コンテナだけでなくパケット自体が壊れている場合——の最後の手段は、完全にデコードして再エンコードすることです。これによりFFmpegは読めるフレームをすべて読み込み、まっさらできれいなファイルを書き出し、デコードできない部分は捨てます。

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
  • -c:v libx264 -crf 23 — 妥当な画質で映像を再エンコード
  • -c:a aac — 音声をAACに再エンコード
  • デコード工程が可能な限り再構築し、復旧不能な部分は破棄

再エンコードは遅く、わずかに劣化しますが、最も寛容な選択肢です。どんなコピー操作も受け付けないファイルを救えることがあります。ffprobe、エラー許容の再multiplex、タイムスタンプ修復がすべて空振りに終わった後の、最終手段として扱ってください。


まとめ: 試す順番

手順コマンドコスト使う場面
1. 特定ffprobe input.mp4なし常に最初——実際の形式を知る
2. 再muxffmpeg -err_detect ignore_err -i input.mp4 -c copy output.mp4数秒・無劣化ストリームは正常、コンテナにゴミ
3. PTS修復ffmpeg -fflags +genpts -i input.mp4 -c copy output.mp4数秒・無劣化不完全・中断したファイル
4. 再エンコードffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4遅い・わずかに劣化他がすべて失敗したとき

必ず上から順に試します。前半の手順はコストがゼロで、しばしばこれだけで解決します。再エンコードは、コピーが受け付けないときだけ持ち出す重いハンマーです。


よくある質問

ffprobe が「形式が拡張子と一致しない」と言います。どうすればいいですか?

FFmpegは拡張子ではなく実際のバイト列を読むので、名前が何であれ適切なdemuxerを選んでファイルを開けます。拡張子の誤りが主につまずかせるのはメディアプレーヤーと人間です。ffprobe が報告する形式へのリネーム(.mp4 として保存された .webminput.webm にする)は、分かりやすさとプレーヤー互換性のためで、FFmpegを動かすためではありません。ffprobe 自体が invalid data を報告する場合は、ラベルの誤りではなく本当に破損しています。

ダウンロードが中断されました。FFmpegで救えますか?

多くの場合救えます。不完全なファイルでも、届いた範囲の映像は通常正常で、欠けているのはファイル末尾のメタデータやタイムスタンプだけです。手順2の再multiplexを試し、続けて手順3の -fflags +genpts を加えてください。ダウンロードできた分をカバーする短いクリップが得られ、たいていは何もないよりましです。

再multiplexでファイルはできましたが、途中で切れます。なぜですか?

そこまでが無事なデータの範囲だからです。エラー許容のコピーは破損地点までのすべてを救い、そこできれいに止まります。もっと欲しい場合、その先のデータはおそらく復旧不能です。再エンコード(手順4)でフレームが数枚余分に絞り出せることはありますが、欠けたバイトを作り出すことはできません。

これは「moov atom not found」エラーと同じですか?

密接に関連していますが、同一ではありません。「moov atom not found」はより具体的なMP4のケースで、インデックス(moov atom)が欠けている状態——典型的には途中で切れたダウンロードが原因です。重要な注意点があります。moov atomが本当に欠けている場合、FFmpegはパケットを1つもdemuxできないことがほとんどで、-err_detect ignore_err-fflags +genpts・再エンコードでもそうしたファイルは基本的に復旧できません。これらが効くのは、FFmpegがまだ使えるストリームをdemuxできる場合だけです。moov atomが本当に欠けているなら、元の/参照用の録画か、専用の修復ツール(untrunc など)が必要になるのが普通です。詳しくはmoov atom 専用ガイドを参照してください。

単に古いFFmpegビルドが原因の可能性は?

稀ですが、珍しいコンテナでは排除しておく価値があります。ffprobe が、ビルドが対応していない形式を示す場合、最新のFFmpegに更新するとdemuxerが追加されることがあります。MP4・MKV・WebMのような主流形式では、古いビルドが原因になることはほぼありません。まずは破損やラベル誤りのファイルを疑ってください。


関連記事


動作確認: ffmpeg 8.1(検証スクリプトで実行確認)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-filters.html#scale / trac.ffmpeg.org/wiki/Scaling