動画圧縮 — 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 範囲低いほど高いほど
libx2640〜51高品質・大容量低品質・小容量
libx2650〜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

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

時間に余裕があれば slowslower を使うと同じ品質でファイルサイズを抑えられる場合があります。


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