動画圧縮 — CRFモードとビットレートモードの選択
動画ファイルのサイズを小さくしたいとき、FFmpeg には大きく分けて「CRF モード(固定品質)」と「ビットレートモード(サイズ・帯域制御)」の 2 つのアプローチがあります。どちらを選ぶかによって、出力品質・ファイルサイズ・エンコード速度のバランスが変わります。本記事では各モードの特徴と使い分けを、ffmpeg 6.1 で確認済みのコマンド例とともに説明します。
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04
1. H.264(libx264)と H.265(libx265)の基本コマンド
まず最もシンプルな変換から始めます。
H.264 で圧縮
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a copy output.mp4
H.265(HEVC)で圧縮
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a copy output.mp4
H.265 は H.264 と比較して同等の視覚品質を得るために必要なデータ量が少ない傾向がありますが、エンコード処理に時間がかかります。また、古いデバイスやプレイヤーによっては再生できないことがあります。
2. CRFモード(固定品質)
CRF とは
CRF(Constant Rate Factor)は、映像の複雑さに応じてビットレートを動的に変化させながら、一定の視覚品質を維持するモードです。動きの少ないシーンではビットレートを下げ、動きの多いシーンでは上げるため、全体的に効率的な圧縮ができます。
CRF の値の範囲
| コーデック | CRF 範囲 | 低いほど | 高いほど |
|---|---|---|---|
| libx264 | 0〜51 | 高品質・大容量 | 低品質・小容量 |
| libx265 | 0〜51 | 高品質・大容量 | 低品質・小容量 |
注意:最適な CRF 値はコンテンツの内容(映画、アニメ、スポーツ映像など)や使用目的によって大きく異なります。上記の初期値(H.264: 23、H.265: 28)はデフォルト設定であり、あらゆる用途で最適という意味ではありません。実際の出力を確認しながら調整してください。
CRFモードのコマンド例
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow -c:a copy output.mp4
CRF を下げると品質が上がり、ファイルサイズも大きくなります。
3. ビットレートモード
ターゲットビットレートを指定して出力するモードです。出力ファイルのサイズをある程度コントロールしたい場合や、配信プラットフォームがビットレート上限を設定している場合に使います。
VBR(可変ビットレート)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -c:a copy output.mp4
-b:v 2000k:映像ビットレートの目標を 2000 kbps に設定
CBR(固定ビットレート)
CBR は -b:v、-minrate、-maxrate、-bufsize を組み合わせて実現します。
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -minrate 2000k -maxrate 2000k -bufsize 4000k -c:a copy output.mp4
CBR はストリーミング配信や帯域制限のある環境での用途に適しています。
4. 2パスエンコード
2パスエンコードは、まず第1パスで映像を分析してデータを記録し、第2パスでその情報を使って指定ビットレートに近い出力を生成する方式です。公式ドキュメントでは “The statistics of the video are recorded in the first pass into a log file…and in the second pass that log file is used to generate the video at the exact requested bitrate.” と説明されています。
単純なビットレート指定(1パス)より目標ビットレートへの精度が高くなります。
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 1 -an -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 2 -c:a copy output.mp4
上記は 2 コマンドのセットです。第1パスでは -an(音声なし)と -f null /dev/null を使って映像のみ分析し、第2パスで実際の出力を生成します。
5. -preset:速度と品質のトレードオフ
-preset オプションはエンコードの速度と圧縮効率のバランスを制御します。
libx264 / libx265 で利用できる主なプリセット(速い順):
ultrafast → superfast → veryfast → faster → fast → medium → slow → slower → veryslow
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a copy output.mp4
ultrafast〜veryfast:エンコードは速いが、同じ CRF 値でもファイルサイズが大きくなりやすいmedium:デフォルト。多くの場面でバランスが良いslow〜veryslow:エンコードに時間がかかるが、同じ CRF 値でより小さいファイルになる傾向がある
時間に余裕があれば slow や slower を使うと同じ品質でファイルサイズを抑えられる場合があります。
6. H.264 vs H.265:どちらを選ぶか
| 観点 | H.264 (libx264) | H.265 (libx265) |
|---|---|---|
| 互換性 | 非常に高い(ほぼすべての環境) | 比較的制限あり(古いデバイス非対応の場合あり) |
| 圧縮効率 | 標準的 | H.264 より効率的な傾向がある |
| エンコード速度 | 速い | 遅い |
| ライセンス | 特許あり | 特許あり |
配信・公開用途で幅広いデバイス対応が必要なら H.264 が安全な選択です。ストレージ効率を優先し、再生環境が H.265 に対応していることが確認できる場合は H.265 が有効な選択肢になります。
7. ファイルサイズの概算
動画のファイルサイズはおよそ次の式で概算できます。
ファイルサイズ (MB) ≈ (映像ビットレート + 音声ビットレート) × 時間(秒) ÷ 8 ÷ 1024 ÷ 1024
例:映像 2000 kbps + 音声 128 kbps、10 分の動画:
(2000 + 128) × 600 ÷ 8 ÷ 1024 ÷ 1024 ≈ 153 MB
CRF モードはコンテンツに応じてビットレートが変動するため、事前の正確な予測は困難です。おおよその目安として参考にしてください。
関連記事
動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-codecs.html / ffmpeg.org/ffmpeg-filters.html