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 を基本にします。サイズ・解像度・コーデックを変えるときやフィルタをかけるとき、またはコンテナに入らずにコピーが失敗するときだけ、再エンコードします。