この記事でわかること
- CRFモードと2パスビットレートモードの違い
- 2パスパイプラインの実行方法:分析パスとエンコードパス
- ビットレート計算で特定のファイルサイズをターゲットにする方法
- カスタムログファイルの場所を指定する
-passlogfileオプション - H.264とH.265の2パスの例
テスト済みバージョン: FFmpeg 6.1(ubuntu-latest / CI検証済み)
対象 OS: Windows / macOS / Linux
CRFモードと2パスビットレートモードの違い
FFmpegのlibx264・libx265エンコーダーには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
-b:v 1Mで映像ビットレートのターゲットを1 Mbit/sに設定-pass 1で分析パスを実行-anで音声を無効化(パス1では不要)-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
-pass 2でパス1のログを読み込んで最終出力をエンコード- 音声はパス2のみでエンコード
両コマンドを同じディレクトリで実行してください — 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