FFmpeg で動画を処理するときは、まず、元の映像や音声をそのままコピーするか、再エンコードするかを決めます。再エンコードは、いったん圧縮前の状態に戻してから圧縮し直すことです。コピーなら画質は変わらず、1秒で終わることもあります。再エンコードは画質が少し落ち、10分かかることもあります。多くの人がつまずくのは、コンテナ(MP4 や MKV などの入れ物の形式)との相性です。

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

ストリームコピーは、すでに圧縮されている映像と音声のデータを、デコード(圧縮前の状態に戻すこと)も圧縮し直しもせずに、新しいコンテナへそのまま移します。基本のコマンドです。

ffmpeg -i input.mp4 -c copy output.mp4
  • -c copy … 出力に入るストリーム(映像・音声・字幕などのデータ)を、すべてそのままコピーします。-c:v copy -c:a copy ... をまとめて書いた形です。-map を付けないと、映像と音声は1本ずつしか選ばれません。字幕は、出力形式に既定の字幕コーデックがあるときだけ1本選ばれます。MP4 にはないので、-map で選ばないと MP4 の出力に字幕は入りません(SRT の字幕は -c:s mov_text も必要です)。

デコードをしないので、ストリームコピーには次の特徴があります。

  • 画質も音質も落ちません。MPEG-TS に入れるときのように、コンテナに合わせてデータの書き方が少し変わることはありますが、再生される映像と音は元と同じです。
  • 速く終わります。ふつうは数秒で、速さはほぼディスクの読み書きの速さで決まります。
  • 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 が入ります。ProRes と、8ビット・μ-law の PCM 音声は入りません。16/24ビットの PCM は入りますが、再生できないプレーヤーが多いです。
  • WebM には VP9・AV1 の映像と、Opus・Vorbis の音声が入ります。H.264 や AAC は入りません。

そのため、画質を変えるつもりがなくても、コピーが失敗することがあります。たとえば、ProRes の映像が入った MOV を MP4 にコピーしようとすると失敗します。

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

Could not find tag for codec ... in stream と表示されたら、そのコーデックは選んだコンテナに入りません。そのコーデックが入るコンテナに変えるか、問題のストリームだけを、コンテナに入るコーデックで再エンコードします(第6章)。

ソースコーデック 対象コンテナ コピー可?
H.264 + AAC MP4 / MKV 可
HEVC + AAC MP4(-tag:v hvc1 を付与) 可
VP9 + Opus WebM / MKV 可
VP9 + Opus MP4 可(再生できない環境がある)
PCM音声 MP4 16/24ビットは可だが再生できないプレーヤーが多い(AACに再エンコード推奨)
ほぼ何でも 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: トリミングコピーの先頭がフリーズ・黒い空白になる

原因: ストリームコピーでは、映像をキーフレームからしか始められません。-ss を -i の後ろに置くと、映像は切る位置より後の最初のキーフレームから始まり、音声は指定した位置から始まります。そのため、そのキーフレームまでは映像がありません。-ss を -i の前に置くと、切る位置より前のキーフレームから書き出し、切る位置までのフレームを編集リスト(edit list)で隠します。編集リストに対応していないプレーヤーでは、隠したフレームも表示されます。 解決策: フレーム単位で正確に切りたいときは再エンコードします。そうでなければ、キーフレームの位置で切れることを受け入れます。

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

原因: -crf(またはビットレート)が、元の動画に見合わないほど高画質な設定になっています。 解決策: CRF の値を上げて(例:23→26)、もっと圧縮します。そもそも再エンコードが必要かどうかも確かめてください。

エラー4: コピーは成功するが、ブラウザで再生が始まるまで時間がかかる

原因: MP4 の moov アトム(再生に必要な目次の情報)が、ファイルの末尾にあります。ブラウザは、末尾の moov アトムを読むまで再生を始められません。 解決策: -movflags +faststart を付けます。詳しくは faststart の解説を見てください。まったく再生できないときは、第4章の表のように、コーデックがブラウザに対応していない可能性があります。

よくある質問

Q1. -c copy で画質が変わることはある? A. 変わりません。圧縮済みのデータをデコードせずに移すので、再生される映像と音は元と同じです。コンテナによってはデータの書き方が少し変わりますが、画質には影響しません。画質が変わるのは、再エンコードしたときだけです。

Q2. なぜ再エンコードはそんなに遅い? A. すべてのフレームを画素のデータまでデコードしてから、圧縮し直すからです。コピーはデータを移すだけなので、処理の量がずっと少なく済みます。

Q3. 無劣化で再エンコードできる? A. ロスレス(可逆)のエンコーダを使えばできます。たとえば FFV1 や、libx264 の -qp 0 です。ただし、ファイルがとても大きくなります。ふつうの非可逆の再エンコードでは、細かい部分が必ず一部失われます。

Q4. ファイルがどのコーデックを使っているか確認するには? A. ffprobe input.mp4 を実行して、Stream で始まる行を見ます。ffprobe -show_streams でも確かめられます。コーデックがわかったら、第4章の表でコピーできるかを確かめてください。

Q5. コピーと再エンコードのどちらを既定にすべき? A. -c copy を基本にします。サイズ・解像度・コーデックを変えるときやフィルタをかけるとき、またはコンテナに入らずにコピーが失敗するときだけ、再エンコードします。

関連記事