FFmpegのほぼすべての作業は、1つの基本的な判断に行き着きます。既存のストリームをコピーするか、再エンコードするか。ここを正しく選べるかどうかが、1秒の無劣化処理になるか、10分のロッシー処理になるかの分かれ目です。本記事では、それぞれが何をするのか、いつ使うのか、そして多くの人がつまずく唯一の落とし穴 — コンテナ互換性 — を解説します。これが腑に落ちれば、他の多くのFFmpegコマンドが理解できるようになります。所要時間:6分。

動作確認: FFmpeg 8.1


この記事でわかること

  1. ストリームコピー(-c copy)が実際に何をするのか
  2. 再エンコードが何をするのか、なぜコストが高いのか
  3. 並べての比較
  4. コンテナ互換性の落とし穴
  5. コピーすべきケースと再エンコードすべきケース
  6. ストリーム単位でのコピー・再エンコード
  7. トラブルシューティングとFAQ

1. ストリームコピー(-c copy

ストリームコピーは、入力のすでに圧縮済みの音声・映像パケットを、デコードも再圧縮もせずにそのまま新しいコンテナへ移します。基本コマンド:

ffmpeg -i input.mp4 -c copy output.mp4
  • -c copy … すべてのストリームをそのままコピー(-c:v copy -c:a copy ... の省略形)。

何もデコードしないため、ストリームコピーは:

  • 無劣化 — メディアは1ビットも変わらない。
  • 高速 — 通常は数秒で完了し、主にディスク速度で律速される。
  • 軽量 — CPU使用はほぼゼロ。

コンテナの変更(リムックス)、キーフレームでのカット、ストリームの結合など — 実際の映像や音声を変えなくてよいすべての作業に適した道具です。


2. 再エンコード

再エンコードは、各フレームを生の状態へデコードしてから、選んだエンコーダで再圧縮します。基本コマンド:

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
  • -c:v libx264 … 映像をH.264に再エンコード。
  • -crf 23 … 画質目標(小さいほど高画質・大きいファイル)。
  • -c:a aac … 音声をAACに再エンコード。

再エンコードは:

  • ロッシー — 再圧縮で(ロッシーコーデックの場合)一部のディテールが失われる。画質は決して向上しない。
  • 低速 — 全フレームをデコード&エンコードするためCPU負荷が高い。
  • 柔軟 — コーデック・解像度・ビットレート・フレームレート・フィルタなどを変更できる。

圧縮・リサイズ・非互換コーデックへの変換・フィルタ適用など、メディアそのものを変える必要があるときに必須です。


3. 並べての比較

-c copy(ストリームコピー)再エンコード
画質無劣化(同一)ロッシー(多少劣化)
速度数秒数分(CPU律速)
CPU使用最小高い
ファイルサイズ元とほぼ同じ制御可能
コーデック変更不可
リサイズ・フィルタ不可
コンテナ変更
任意位置でカットキーフレームのみ任意フレーム

経験則:できるならコピー、必要なときだけ再エンコード。


4. コンテナ互換性の落とし穴

ソースのコーデックが対象コンテナで許可されていない場合、ストリームコピーは失敗します。各コンテナは特定のコーデックしか受け付けません。例えば:

  • MP4はH.264・HEVC・AACを受け付けるが、PCMやProResは不可
  • WebMはVP9/AV1+Opus/Vorbisを受け付けるが、H.264やAACは不可

そのため、画質変更を一切意図していなくても次は失敗し得ます:

ffmpeg -i input.mp4 -c copy output.mp4

FFmpegが Could not find tag for codec ... in stream を出したら、そのコーデックは選んだコンテナに収まりません。対処は、互換コンテナを選ぶか、問題のストリームだけをコンテナが受け付けるコーデックに再エンコードすることです(第6章)。

ソースコーデック対象コンテナコピー可?
H.264 + AACMP4 / MKV
HEVC + AACMP4(-tag:v hvc1 を付与)
VP9 + OpusWebM / MKV
VP9 + OpusMP4不可(再エンコード)
PCM音声MP4不可(音声を再エンコード)
ほぼ何でもMKVたいてい可

MKVは最も寛容なコンテナで、MP4より圧倒的にストリームコピーが「そのまま通る」理由でもあります。


5. コピーすべきケースと再エンコードすべきケース

-c copy を使う場合:

  • コンテナだけ変える(例:MKV→MP4、MOV→MP4)。
  • キーフレーム境界でトリミングする。
  • メディアを変えずに結合・分割する。
  • ストリームがすでに対象と互換である。

再エンコードする場合:

  • ファイルサイズを小さくする圧縮。
  • 解像度・フレームレート・ピクセルフォーマットの変更。
  • コンテナや機器が要求するコーデックへの変換。
  • フィルタ適用(scale・crop・overlay・字幕焼き込み・色調整)。
  • キーフレーム間でフレーム精度のカット。

6. ストリーム単位の選択

すべてのストリームを同じに扱う必要はありません。よくあるパターンは、映像(エンコードが高コストな部分)はコピーしつつ、音声だけを互換コーデックに再エンコードする方法です。

ffmpeg -i input.mp4 -c:v copy -c:a aac -b:a 192k output.mp4

ここでは映像は無加工で一瞬、音声だけ再エンコード — フル再エンコードよりはるかに速く、音声コーデックの非互換を解決できます。逆(映像を再エンコード、音声をコピー)も同様です。

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4

7. トラブルシューティング

エラー1: Could not find tag for codec ... in stream

原因: コピー時、ソースのコーデックが対象コンテナで許可されていない。 解決策: 互換コンテナ(最も寛容なのはMKV)を選ぶか、そのストリームを再エンコードする(第6章)。

エラー2: トリミングコピーの先頭がフリーズ・黒い空白になる

原因: ストリームコピーはキーフレームでしかカットできず、最寄りのキーフレームに吸着する。 解決策: フレーム精度のカットには再エンコードを使うか、キーフレーム境界を許容する。トリミングの手順は関連ガイド参照。

エラー3: 再エンコードでファイルが小さくならず大きくなった

原因: -crf(やビットレート)がソースに見合わないほど高画質に設定されている。 解決策: CRF値を上げて(例:23→26)より圧縮する。そもそも再エンコードが本当に必要か確認する。

エラー4: コピーは成功するがブラウザで再生できない

原因: MP4のmoovアトムが末尾にある。 解決策: -movflags +faststart を付ける。faststartガイド参照。


よくある質問

Q1. -c copy で画質が変わることはある? A. ありません。圧縮済みパケットをそのままコピーするので、メディアは1ビット単位で同一です。画質を変えられるのは再エンコードだけです。

Q2. なぜ再エンコードはそんなに遅い? A. 全フレームを生のピクセルにデコードして再圧縮するからです。コピーは既存パケットを移すだけで、処理量は桁違いに少なくなります。

Q3. 無劣化で再エンコードできる? A. ロスレスエンコーダ(FFV1、libx264の -qp 0 など)でのみ可能ですが、ファイルが巨大になります。通常のロッシー再エンコードは必ず一部のディテールを捨てます。

Q4. ファイルがどのコーデックを使っているか確認するには? A. ffprobe input.mp4 を実行してストリーム行を読むか、ffprobe -show_streams を使います。その後、第4章の表でコピー互換性を確認してください。

Q5. コピーと再エンコードのどちらを既定にすべき? A. -c copy を既定にしましょう。メディアを実際に変える必要があるとき(サイズ・解像度・コーデック・フィルタ)、またはコンテナ非互換でコピーが失敗するときだけ再エンコードします。


関連記事


Tested with FFmpeg 8.1 — verified with our command-check script 一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-codecs.html