FFmpegが即座に Invalid data found when processing input で止まり、何も変換されない場合は、原因を順に切り分けて対処します。このエラーは、FFmpegがファイルを開けたものの中身を解釈できなかったことを意味します。つまり、バイト列がコンテナの示す形式と一致していません。原因はいくつかに限られます。まずファイルが実際に何なのかを確認し、次にいちばん安全な修復を試し、それでもダメなときだけ再エンコードします。
エラーは入力を指しているので、調査もそこから始めます。多くの場合、ファイルは不完全である・壊れている・そもそもメディアファイルでない、のいずれかです。まずどれに当たるかを確かめます。復旧できるのは、その一部だけです。
よくある原因
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 -i input.mp4 -c copy output.mp4
-c copy— 出力に入るストリームを再エンコードせずにコピー- 新しいファイルへ出力 — インデックスを作り直したきれいなコンテナ
これは救えるパケットからコンテナを書き直します。破損がインデックスの破壊や末尾のゴミだけだった場合、新しい output.mp4 は問題なく再生できることがよくあります。コピーなので画質の劣化はなく、数秒で済みます。
手順3: 欠けたタイムスタンプを生成する
BフレームのあるAVIなど、デコードタイムスタンプ(DTS)はあっても表示タイムスタンプ(PTS)が無いパケットを含むファイルがあります。これをMP4へコピーすると pts has no value と表示されます。-fflags +genpts フラグは、欠けているPTSをDTSから生成するようFFmpegに指示します。
ffmpeg -fflags +genpts -i input.mp4 -c copy output.mp4
-fflags +genpts— 欠けている表示タイムスタンプを生成-c copy— 再エンコードはしない
途中で切れたファイルは、これでは直りません。MP4のタイミング情報はmoov atomにあり、+genpts では作り直せないためです。Non-monotonic DTS というメッセージは警告で、FFmpegはタイムスタンプを調整して処理を続けます。+genpts を付けても変わりません。
手順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. 再mux | ffmpeg -i input.mp4 -c copy output.mp4 |
数秒・無劣化 | ストリームは正常、コンテナにゴミ |
| 3. PTS生成 | ffmpeg -fflags +genpts -i input.mp4 -c copy output.mp4 |
数秒・無劣化 | PTSの無いパケット(pts has no value) |
| 4. 再エンコード | ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4 |
遅い・わずかに劣化 | 他がすべて失敗したとき |
必ず上から順に試します。前半の手順はコストがかからず、これだけで解決することもよくあります。再エンコードは、コピーで直らないときだけ使います。
よくある質問
ffprobe が「形式が拡張子と一致しない」と言います。どうすればいいですか?
FFmpegは拡張子ではなく実際のバイト列を読むので、名前が何であれ適切なdemuxerを選んでファイルを開けます。拡張子の誤りで困るのは、主にメディアプレーヤーと人です。ffprobe が報告する形式へのリネーム(.mp4 として保存された .webm を input.webm にする)は、分かりやすさとプレーヤー互換性のためで、FFmpegを動かすためではありません。ffprobe 自体が invalid data を報告する場合は、ラベルの誤りではなく本当に破損しています。
ダウンロードが中断されました。FFmpegで救えますか?
形式によります。TS や MKV、先頭に moov がある MP4(faststart)なら、届いた範囲を取り出せることが多いです。手順2の再multiplexを試してください。ダウンロードできた分だけの短いクリップが得られます。moov が末尾にある通常の MP4 で末尾が欠けている場合は、下の「moov atom not found」の状態で、FFmpeg だけではほぼ復旧できません。
再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ビルドが原因の可能性は?
稀ですが、珍しいコンテナでは確認しておく価値があります。ビルドにその形式のdemuxerが無い場合、ffprobe は形式名を示せず、同じ Invalid data found を報告します。最新のFFmpegに更新するとdemuxerが追加されることがあります。MP4・MKV・WebMのような主流形式では、古いビルドが原因になることはほぼありません。まずは壊れたファイルや、そもそもメディアでないファイルを疑ってください。