この記事でわかること

テスト済みバージョン: FFmpeg 6.1(ubuntu-latest / CI検証済み)
対象 OS: Windows / macOS / Linux


CRFモードと2パスビットレートモードの違い

FFmpegのlibx264libx265エンコーダーには2つの主要な品質/ビットレート制御モードがあります:

モードオプション使い所
CRF(固定レートファクター)-crf 18〜28品質を一定にしたい、ファイルサイズは変動してよい
2パスビットレート-b:v N -pass 1/2特定のファイルサイズやビットレートを達成する必要がある

CRFはシンプルで、アーカイブやストリーミングに多く使われます。2パスは特定のサイズ制限(メール添付ファイルの上限、ディスク容量など)に収める必要がある場合に適しています。


2パスの仕組み

パス1(分析): FFmpegが動画を高速にエンコードし、各フレームの複雑さを記録したログファイルを書き出します。出力動画は生成されません — ログファイルだけが重要です。

パス2(エンコード): FFmpegがログファイルを読み込んでどのシーンにより多くのビットが必要かを理解し、分析に基づいてビットレートを配分しながら最終出力をエンコードします。

ログファイルは作業ディレクトリにffmpeg2pass-0.log(H.264ではffmpeg2pass-0.log.mbtreeも)として生成されます。


基本的な2パスH.264の例

パス1 — 分析のみ、出力なし:

ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 -an -f null /dev/null

パス2 — 分析データを使った実際のエンコード:

ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 2 -c:a aac -b:a 128k output.mp4

両コマンドを同じディレクトリで実行してください — FFmpegはカレントディレクトリでffmpeg2pass-0.logを探します。


特定のファイルサイズをターゲットにする

目標ファイルサイズからビットレートを計算する方法:

合計ビットレート_kbps = (目標サイズ_MB × 8192) ÷ 動画時間_秒
映像ビットレート_kbps = 合計ビットレート_kbps − 音声ビットレート_kbps

例: 4分(240秒)の動画を128kbps音声込みで50MBに収める場合:

合計 = (50 × 8192) ÷ 240 ≈ 1707 kbps
映像 = 1707 − 128 = 1579 kbps ≈ 1.5M

パス1:

ffmpeg -i input.mp4 -c:v libx264 -b:v 1500k -pass 1 -an -f null /dev/null

パス2:

ffmpeg -i input.mp4 -c:v libx264 -b:v 1500k -pass 2 -c:a aac -b:a 128k output.mp4

カスタムログファイルの場所

デフォルトではFFmpegはログを./ffmpeg2pass-0.logに書き込みます。-passlogfileで別のパスを指定できます(スクリプト内や複数ファイルを並列エンコードする場合に便利):

ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 -passlogfile /tmp/mylog -an -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 2 -passlogfile /tmp/mylog -c:a aac output.mp4

2パスH.265(libx265)

H.265での2パスエンコードも同様の構造です:

ffmpeg -i input.mp4 -c:v libx265 -b:v 800k -x265-params pass=1 -an -f null /dev/null
ffmpeg -i input.mp4 -c:v libx265 -b:v 800k -x265-params pass=2 -c:a aac output.mp4

注意:libx265-pass 1の代わりに-x265-params pass=1を使います。動作は同じです。


エンコーダープリセットの追加

2パスにエンコーダープリセットを組み合わせられます。遅いプリセットほど効率的なコーディングの判断に時間をかけます:

ffmpeg -i input.mp4 -c:v libx264 -preset slow -b:v 1M -pass 1 -an -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -preset slow -b:v 1M -pass 2 -c:a aac -b:a 128k output.mp4

ログファイルとパス2の分析が一致するよう、両パスで同じプリセットを使用してください。


2パスを使うべき場面

シナリオ推奨
一定の映像品質でアーカイブCRFモード(-crf 23)を使用
特定のサイズ制限に収める必要がある2パスビットレートモードを使用
保証されたビットレートでストリーミング配信2パス(または-maxrateによる制約付きビットレート)
クイックトランスコードやプレビューCRFモード(シングルパス)

よくある問題

パス2でログファイルが見つからない

パス2がパス1と異なるディレクトリで実行されると、ffmpeg2pass-0.logを見つけられません。両パスを同じディレクトリで実行するか、両パスで-passlogfile /path/to/logを使用してください。

パス1での音声エンコード

-anでパス1の音声エンコードをスキップするのは正しい対応です — ログには映像の複雑さデータのみ必要です。パス1に音声を含めても時間の無駄になります。

両パスで同じ-b:vを使用する

両パスで必ず同じ-b:v値を使用してください。異なる値を使うと、パス1のログが別のビットレートをターゲットにしてしまい、信頼性の低い結果になります。


関連記事


テスト環境: ffmpeg 6.1.1 / Ubuntu 24.04(GitHub Actions)
一次ソース: trac.ffmpeg.org/wiki/Encode/H.264 / ffmpeg.org/ffmpeg.html