FFmpegでよく出るエラーの原因と解決方法を、エラーメッセージごとに確認できます。

1. Unknown encoder ‘libx264’

エラーメッセージ

Unknown encoder 'libx264'

FFmpeg 8.1 では、続けて次の行も表示されます。

Error opening output files: Encoder not found

原因

libx264 はH.264エンコード用の外部ライブラリです。FFmpegのビルド時に --enable-libx264 が含まれていない場合、このエンコーダは使用できません。

解決方法

1. 利用可能なエンコーダを確認する:

ffmpeg -encoders | grep 264

2. フルビルド版のFFmpegを使う:
公式サイト(ffmpeg.org)が配布しているのはソースコードだけです。ダウンロードページで案内されているビルド(Windows なら gyan.dev など)や、各ディストリビューションのパッケージ(Ubuntu: ffmpeg、macOS: brew install ffmpeg)は通常 libx264 を含んでいます。

3. 代替エンコーダを試す:

ffmpeg -i input.mp4 -c:v libopenh264 output.mp4

libopenh264はCiscoが提供するH.264エンコーダです。別途ライセンス上の制約がありますが、多くの環境で使えます。

2. moov atom not found

エラーメッセージ

moov atom not found

原因

MP4ファイルの構造情報(moovアトム)がファイル内に見つからない場合に発生します。多くは、録画やダウンロードが途中で止まり、moov が書かれるはずだったファイルの末尾が欠けているケースです。moov が末尾にあるだけの正常なファイルなら、FFmpeg は問題なく読めます。

解決方法

moov が欠けたファイルは、FFmpeg のオプションでは直せません。-movflags +faststart を付けて -c copy しても、入力を開く段階で同じエラーになります。

  • ダウンロードやコピーの途中で切れたファイルなら、元のファイルを取り直します
  • 録画が途中で止まったファイルは、同じ機材・同じ設定で撮った正常なファイルを参照して修復する untrunc などの専用ツールを検討してください

3. Invalid data found when processing input

エラーメッセージ

Invalid data found when processing input

または(moov が欠けた MP4 の場合)

[in#0 @ ...] moov atom not found
[in#0 @ ...] Error opening input: Invalid data found when processing input

原因

入力ファイルが破損している・途中で切れている、またはそもそも動画ファイルではない(HTML のエラーページを保存したものなど)場合に発生します。拡張子が違うだけなら、FFmpeg は中身から形式を判別して読めます。

解決方法

ファイルは開けて途中でエラーになる場合は、-err_detect ignore_err を試す:

ffmpeg -err_detect ignore_err -i input.mp4 output.mp4
  • -err_detect ignore_err:デコードエラーを無視して処理を続けます。これを使うのは MPEG-4 Part 2(Xvid・DivX)など一部のデコーダだけで、H.264 では付けなくても結果は同じです
  • FFmpeg はこれを付けなくても、デコードエラーで止まらずに処理を続けます。壊れたフレームが抜けたり乱れたりすることがありますが、再生可能なファイルを作れる場合があります
  • 入力を開く段階でこのエラーになる場合(moov の欠落や、動画ではないファイル)は効きません

ffprobe で実際の形式を確認する:

ffprobe input.mp4

FFmpeg は拡張子ではなく中身で形式を判別するので、拡張子が違うだけなら -f は不要です。中身が WebM のファイルに -f mp4 を付けるなど、中身と違う形式を指定すると、かえってこのエラーになります。ffprobe でも同じエラーになる場合は、ファイルが壊れているか、動画ファイルではありません。

4. Output file already exists

エラーメッセージ

File 'output.mp4' already exists. Overwrite? [y/N]

原因

出力先に同名のファイルが既にあります。デフォルトでは、上書きしてよいか確認を求めます。

解決方法

オプション 動作
-y 既存ファイルを確認なしで上書き
-n 既存ファイルがある場合は上書きせず、変換しないで終了
ffmpeg -y -i input.mp4 output.mp4
ffmpeg -n -i input.mp4 output.mp4

スクリプトやバッチ処理では -y を明示的に指定するのが一般的です。-n で止まったときは File 'output.mp4' already exists. Exiting. と表示されますが、終了コードは 0 です。変換していなくても、スクリプトからは成功に見えます。

5. Conversion failed!

エラーメッセージ

Conversion failed!

このときの終了コードは、FFmpeg 6.1 以降では -22 のような負の値です(Linux・macOS では 234 のように表示されます)。FFmpeg 6.0 以前は 1 です。

原因

このメッセージ自体は「何か失敗した」という総合的なエラーで、具体的な原因は直前のログに出ています。

診断手順

  1. エラーログをよく読む: Conversion failed! の直前に具体的なエラー原因が表示されています
  2. 詳細ログを有効にする: -v verbose または -v debug を追加すると、より詳しい情報が得られます
ffmpeg -v verbose -i input.mp4 output.mp4
  1. よくある原因のチェックリスト:
    • エンコーダが設定を受け付けるか(例: yuv420p の映像で幅や高さが奇数だと、libx264 は失敗します。ハードウェアエンコーダは、そのハードウェアが無いと失敗します)
    • 出力形式がそのコーデックを格納できるか(Could not find tag for codec … と出たら格納できません)
    • フィルタの値が入力に合っているか(例: 320x240 の動画に crop=400:300 を付けると失敗します)
    • ディスク空き容量は十分か

入力ファイルのパスが違う、出力先フォルダーが無い、FFmpeg が知らないエンコーダ名やフィルタ名を指定した、といった場合は、処理を始める前に止まります。このときは Conversion failed! ではなく、Error opening input files: … や Error opening output files: … などと表示されます。

6. height not divisible by 2

エラーメッセージ

height not divisible by 2 (1920x1081)

または

width not divisible by 2

原因

一般的な 4:2:0 形式(yuv420p)の映像では、H.264などのコーデックは解像度の縦・横が 2の倍数 であることを要求します。奇数ピクセルの解像度が指定されると発生します。

解決方法

scale フィルタの -2 指定で自動的に偶数に調整する:

ffmpeg -i input.mp4 -vf scale=1280:-2 output.mp4
  • scale=幅:-2:幅を指定し、高さはアスペクト比を保ちながら偶数に自動調整
  • -2 は「アスペクト比を保ったうえで、いちばん近い2の倍数に丸める」を意味します

trunc 関数を使う方法(幅・高さ両方を調整):

ffmpeg -i input.mp4 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
  • trunc(iw/2)*2:入力幅を2の倍数に切り下げ
  • trunc(ih/2)*2:入力高さを2の倍数に切り下げ
  • 式に ( ) や * を含むので、シェルでは引用符で囲みます

7. Unknown encoder ‘Copy’ / コーデック指定の注意点

エラーメッセージ

Unknown encoder 'Copy'

または

Unknown encoder 'COPY'

原因

-c:v copy の copy は大文字・小文字を区別します。Copy や COPY は無効です。また引用符の種類(全角引用符など)も問題になることがあります。

解決方法

必ず 半角小文字 で記述してください。

# NG(大文字)
ffmpeg -i input.mp4 -c:v Copy output.mp4

# OK(半角小文字)
ffmpeg -i input.mp4 -c:v copy output.mp4

コーデック名は常に半角の小文字で指定します。- や _ を含む名前もあります(例: libx264, aac, libvpx-vp9, pcm_s16le)。

エラー対処の基本フロー

1. エラーメッセージ全文を読む(最後の数行だけでなく、ログ全体を確認)
2. ffprobe で入力ファイルを確認する(コーデック・フォーマットが正しいか)
3. ffmpeg -encoders / -decoders でコーデックの可否を確認する
4. -v verbose を追加して詳細ログを取得する
5. コマンドを最小構成に戻して切り分ける

関連記事

よくある質問

インストールはできたのにコマンドが通らない

ffmpeg -version で確認します。エラーになる場合は PATH が通っていません(ffmpeg があるフォルダー(例: /usr/local/bin)を PATH に追加します)。バージョン情報が表示される場合は、コマンドの書き方の問題なので、個別の記事を参照してください。

“Conversion failed!” だけ出て詳細が分からない

-loglevel debug を付けて再実行すると、詳細なログが出ます。エンコーダやフィルタのエラーなど、具体的な原因が分かります。

「Stream map … matches no streams」

-map 0:1 のような指定で、入力に無いストリームを選んでいます。ffprobe input.mp4 でストリーム番号を確認してから、-map を修正してください。無くてもよいストリームなら、末尾に ? を付けます(例: -map "0:a?")。

エンコード途中でメモリ不足になる

長尺の動画と複雑なフィルタチェーンの組み合わせが原因であることが多いです。-threads 1 で並列度を下げるか、入力を -ss / -t で短く区切って処理してから、後で結合してください。

実行が遅すぎる

-preset を medium から fast または ultrafast に変更します。NVENC / QSV / VideoToolbox などのハードウェアエンコーダが使えるかどうかは、ffmpeg -encoders | grep nvenc などで確認できます。