← All posts

FFmpeg 動画圧縮のベストプラクティス——実測で見る完全ガイド

CRF とプリセット、2-pass、コーデック比較、解像度スケーリング、現場のシナリオまで。実測値ベースで FFmpeg 動画圧縮の勘所を全部書きます。

FFHub·2026-05-11
FFmpeg 動画圧縮のベストプラクティス——実測で見る完全ガイド

FFmpeg の動画圧縮は結局 3 つのつまみ——CRF(品質)、preset(速度)、コーデック(効率)——のバランスです。本ガイドは CRF の理論から 2-pass エンコード、H.264 vs H.265 vs AV1 ベンチマーク、実シナリオ(Web / SNS / アーカイブ / HLS)まで踏み込み、すべてコピペで動くコマンド付きで解説します。

Try it in your browser

スクリプトに組み込む前にブラウザで設定を試す——動画をドロップして CRF / preset を選び、結果を確認できます。

CRF(Constant Rate Factor)を理解する

CRF は品質ベース圧縮で最重要の設定。「視覚品質を一定に保て、ビットレートは必要に応じて変動させていい」とエンコーダに伝えるパラメータです。CRF 低 = 高品質 = ファイル大。CRF 高 = 低品質 = ファイル小。

H.264(libx264)の CRF 値

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

H.264 の CRF レンジは 0(ロスレス)〜 51(最低品質)。値ごとの傾向:

CRF品質レベル典型的な用途ファイルサイズ(CRF 23 比)
0ロスレスアーカイブ、編集マスター10〜50 倍
14ニアロスレスプロのポスプロ4〜6 倍
18視覚的にロスレス高品質配信、プレミアムストリーム2〜3 倍
20優秀高品質 Web 動画1.5〜2 倍
23良好(デフォルト)汎用、Web 配信1 倍(基準)
26許容範囲SNS、モバイル配信0.5〜0.7 倍
28やや低帯域制約のある配信0.3〜0.5 倍
32プレビュー、サムネイル0.15〜0.25 倍
40非常に低極端な圧縮(ギリギリ視聴可)0.05〜0.1 倍
51最低使うな極小

多くの用途でのスイートスポットは CRF 18〜28。 18 未満は、ほとんどの視聴者が知覚できない品質差にビットを使っているだけ。28 を超えるとアーティファクトが見えてきます。

H.265(libx265)の CRF 値

H.265 は H.264 と同じ視覚品質をだいたい 40〜50% 低いビットレートで達成できます。ただし CRF スケールがずれる:H.265 の CRF 28 ≒ H.264 の CRF 23 くらい。

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
CRF(H.265)H.264 CRF 換算品質レベル
18約 14ニアロスレス
22約 18視覚的にロスレス
24約 20優秀
28約 23良好(デフォルト)
32約 26許容範囲
36約 30

適切な CRF をどう選ぶか

実用的な手順:

  1. デフォルトで始める(H.264 なら 23、H.265 なら 28)
  2. 出力を確認——品質に納得できるか?
  3. ±2〜4 のレンジで調整
  4. A/B テスト——同じ複雑シーンを 2 つの CRF でエンコードして比較

圧縮アーティファクトが目立つシーンは:速い動き、細かいテクスチャ(草、布)、グラデーション(空、霧)、ディテールの細かい暗いシーン。初心者向け解説は FFmpeg で動画を圧縮するガイド を参照。

エンコードプリセット:速度 vs 品質

FFmpeg の preset パラメータは、エンコーダが圧縮最適化に CPU 時間をどれだけ使うかを指定します。遅いプリセットほど圧縮が良くなる(同じ品質で小さいファイル)が、エンコード時間が伸びる。

H.264 プリセットのベンチマーク

すべて CRF 23、1080p 60fps の 2 分動画で計測:

Presetエンコード時間ファイルサイズ品質(VMAF)
ultrafast15s85 MB92.1
superfast22s62 MB93.8
veryfast30s48 MB94.5
faster40s42 MB95.0
fast52s38 MB95.3
medium70s35 MB95.5
slow120s33 MB95.7
slower210s31 MB95.8
veryslow450s30 MB95.9
placebo1800s29.5 MB95.9

ポイント:

  • medium がデフォルト、ワークフロー上のスイートスポット
  • mediumslow でファイルサイズ約 6% 削減、時間は 70% 増
  • mediumveryslow で約 14% 削減、時間は 6.4 倍
  • placeboveryslow とほぼ同じ——使うな
  • ultrafastmedium より 2.4 倍デカいファイルを作る——本番納品に使うな
# Good default for most use cases
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4

# When encoding time matters more than file size
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset fast output.mp4

# When file size matters more than encoding time
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow output.mp4

H.265 プリセットの挙動

H.265 もプリセット名は同じだが、各段階でエンコードがかなり遅い:

PresetH.264 時間H.265 時間H.265 ファイルサイズ
fast52s180s25 MB
medium70s300s22 MB
slow120s600s20 MB

H.265 は同じプリセットで H.264 の約 3〜5 倍時間がかかるが、同等品質で 30〜40% 小さいファイルになる。

2-pass エンコード

2-pass はビットレート(つまり最終ファイルサイズ)を精密に制御したいとき必須——「この動画は 50MB 以下に収めたい」みたいな指定がある場合。

仕組み

  • Pass 1:FFmpeg が動画を解析して複雑度ログを書き出す
  • Pass 2:そのログをもとに、複雑なシーンに多くのビット、単純なシーンに少なめのビットを割り当てる

基本コマンド

# Pass 1 — analyze (output is discarded)
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -pass 1 -f null /dev/null

# Pass 2 — encode using analysis data
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -pass 2 output.mp4

目標ビットレートの計算

目標ファイルサイズに収めたいとき:

動画ビットレート = (目標サイズ bit - 音声 bit) / 動画長 (秒)

例:10 分の動画、目標 100MB、音声 128kbps:

Audio size = 128,000 bps × 600s = 76,800,000 bits = 9.6 MB
Video bitrate = (100 MB - 9.6 MB) × 8,000,000 / 600 = 1,205,333 bps ≈ 1.2 Mbps
ffmpeg -i input.mp4 -c:v libx264 -b:v 1200k -pass 1 -c:a aac -b:a 128k -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 1200k -pass 2 -c:a aac -b:a 128k output.mp4

CRF vs 2-pass:どっちを使う?

方式向いてる場面制御軸
CRF一定品質、サイズは気にしない品質ベース
2-passサイズ/ビットレートをピン留めサイズベース
CRF + maxrate品質維持+ビットレート上限ストリーミング向け

ストリーミング用にビットレート上限を付けたいとき:

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M output.mp4

CRF 23 の品質を狙いつつ 4 Mbps で頭打ちにする——帯域が限られるストリーミングで使えます。

コーデック比較:H.264 vs H.265 vs VP9 vs AV1

正しいコーデック選びは、圧縮効率・エンコード速度・再生互換性のトレードオフです。

圧縮効率

同じ視覚品質(VMAF 95)での相対ファイルサイズ:

コーデック相対ファイルサイズH.264 比の圧縮率
H.264(libx264)100%基準
H.265(libx265)55〜65%35〜45% 小
VP9(libvpx-vp9)55〜65%35〜45% 小
AV1(libaom-av1)40〜50%50〜60% 小

エンコード速度

1080p 60fps ソースを同等品質でエンコードしたときの相対時間:

コーデックエンコード時間(相対)
H.2641 倍高速、最適化が進んでる
H.2653〜5 倍目に見えて遅い
VP95〜10 倍非常に遅い(デフォルトでシングルスレッド)
AV1(libaom)20〜50 倍極端に遅い
AV1(SVT-AV1)3〜8 倍AV1 のはるかに速い実装

再生互換性(2026 年)

コーデックブラウザモバイルスマート TVハードウェアデコード
H.26499%+99%+99%+ほぼすべて
H.265Safari、Edge(一部)iOS、Android 5+多くのモダン機一般的
VP9Chrome、Firefox、EdgeAndroid 5+限定的増えつつある
AV1Chrome、Firefox、Edge、Safari 17+フラッグシップ機限定的出てきた段階

実用コマンド

# H.264 — maximum compatibility
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

# H.265 — 40% smaller, good mobile support
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4

# VP9 — royalty-free, good for web
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -row-mt 1 -c:a libopus -b:a 128k output.webm

# AV1 (SVT-AV1) — best compression, modern devices
ffmpeg -i input.mp4 -c:v libsvtav1 -crf 30 -preset 6 -c:a libopus -b:a 128k output.mp4

どのコーデックを選ぶか

シナリオ推奨コーデック理由
最大限の互換性H.264どこでも再生できる
帯域節約 + Apple エコシステムH.265圧縮良好、iOS/macOS でネイティブ
Web 中心 + ロイヤリティフリーVP9Chrome/Firefox 対応、ライセンス料なし
将来性 + 最高圧縮AV1(SVT-AV1)50% 以上削減、対応拡大中
観衆混在H.264 + H.265/AV1 フォールバックデバイス別に最適コーデック配信

コンテナ形式の切り替えについては 動画フォーマット変換ガイド を参照。

解像度スケーリングのベストプラクティス

解像度を「単に変える」だけではダメな話です。

代表的な解像度

名称解像度典型的なビットレート(H.264)典型的なビットレート(H.265)
4K UHD3840x216015〜30 Mbps8〜15 Mbps
1440p2560x14408〜15 Mbps4〜8 Mbps
1080p Full HD1920x10804〜8 Mbps2〜4 Mbps
720p HD1280x7202〜4 Mbps1〜2 Mbps
480p SD854x4801〜2 Mbps0.5〜1 Mbps
360p640x3600.5〜1 Mbps0.3〜0.5 Mbps

アスペクト比を保ったスケーリング

片方の次元には -1 を、もう片方が偶数になるように -2 を使う(多くのコーデックが偶数を要求する):

# Scale to 720p width, auto-calculate height (divisible by 2)
ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:v libx264 -crf 23 output.mp4

# Scale to 1080 height, auto-calculate width
ffmpeg -i input.mp4 -vf "scale=-2:1080" -c:v libx264 -crf 23 output.mp4

スケーリングフィルタの品質

FFmpeg は複数のスケーリングアルゴリズムを持ちます。デフォルト(bilinear)はだいたいこれで十分ですが、品質重視のダウンスケールには Lanczos:

# High-quality downscale with Lanczos
ffmpeg -i input.mp4 -vf "scale=1280:720:flags=lanczos" -c:v libx264 -crf 23 output.mp4
アルゴリズム速度ダウンスケール品質向いてる用途
fast_bilinear最速リアルタイム処理
bilinear速いデフォルト、汎用
bicubic中程度の品質要求
lanczosやや遅い最良最終納品、品質重視
splineやや遅い優秀Lanczos の代替

アップスケールするな

原則、動画のアップスケールはやらない。720p ソースを 1080p でエンコードするのは、実ディテールを増やさないまま帯域を浪費するだけ。どうしても必要なときは最小限に、Lanczos で:

# If you must upscale (avoid when possible)
ffmpeg -i input_720p.mp4 -vf "scale=1920:1080:flags=lanczos" -c:v libx264 -crf 20 output.mp4

音声圧縮

動画圧縮の話で音声は見落とされがちですが、最適化すると帯域がだいぶ浮きます。

推奨設定

用途コーデックビットレートコマンド
一般 Web 動画AAC128 kbps-c:a aac -b:a 128k
高品質動画AAC192 kbps-c:a aac -b:a 192k
音楽中心AAC256 kbps-c:a aac -b:a 256k
WebM/VP9 動画Opus128 kbps-c:a libopus -b:a 128k
ポッドキャスト/話声AAC64 kbps-c:a aac -b:a 64k
ポッドキャスト/話声(Opus)Opus48 kbps-c:a libopus -b:a 48k

ラウドネス正規化

動画間の音量がバラバラなのはあるあるな問題。FFmpeg の loudnorm フィルタで放送基準に正規化:

# Normalize to -16 LUFS (standard for streaming)
ffmpeg -i input.mp4 -c:v copy -af "loudnorm=I=-16:TP=-1.5:LRA=11" -c:a aac -b:a 128k output.mp4

音声を捨てる

音声が要らないとき:

ffmpeg -i input.mp4 -an -c:v libx264 -crf 23 output.mp4

音声を再エンコードしないでコピー

音声がすでに適したフォーマットなら:

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4

現場で使う圧縮シナリオ

Web 配信(汎用)

最も多いシナリオ——サイト埋め込み用の圧縮:

ffmpeg -i input.mp4 \
  -c:v libx264 -crf 23 -preset medium \
  -vf "scale=1920:1080:flags=lanczos" \
  -c:a aac -b:a 128k \
  -movflags +faststart \
  output.mp4

ポイント:

  • -movflags +faststart でメタデータをファイル先頭に移動。プログレッシブ再生が可能になる(Web では必須)
  • CRF 23 は品質とサイズのバランスが良い
  • AAC 128k は Web コンテンツとしては十分

SNS 向け最適化

Twitter/X、Instagram、TikTok などプラットフォームごとの要件:

# Optimized for social platforms (H.264, AAC, fast start)
ffmpeg -i input.mp4 \
  -c:v libx264 -crf 23 -preset medium \
  -profile:v high -level:v 4.0 \
  -pix_fmt yuv420p \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
  -c:a aac -b:a 128k -ar 44100 \
  -movflags +faststart \
  output.mp4
  • -profile:v high -level:v 4.0 で広い互換性を担保
  • -pix_fmt yuv420p で全デバイス再生を保証
  • scale + pad フィルタでレターボックス付き 9:16 縦動画を作る

アーカイブ(最高品質、最小ロス)

長期保存でファイルサイズを気にしない場合:

ffmpeg -i input.mp4 \
  -c:v libx264 -crf 16 -preset slow \
  -c:a flac \
  output.mkv
  • CRF 16 で視覚的なディテールをほぼすべて保持
  • FLAC はロスレス
  • MKV は MP4 より多くのコーデックに対応

ストリーミング(HLS の ABR)

ABR ストリーミング用に複数品質を生成:

ffmpeg -i input.mp4 \
  -map 0:v -map 0:a -map 0:v -map 0:a -map 0:v -map 0:a \
  -c:v libx264 -crf 22 \
  -c:a aac -b:a 128k \
  -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
  -b:v:0 5M -maxrate:v:0 5.5M -bufsize:v:0 10M -s:v:0 1920x1080 \
  -b:v:1 2.5M -maxrate:v:1 2.75M -bufsize:v:1 5M -s:v:1 1280x720 \
  -b:v:2 1M -maxrate:v:2 1.1M -bufsize:v:2 2M -s:v:2 854x480 \
  -f hls -hls_time 6 -hls_list_size 0 \
  -master_pl_name master.m3u8 \
  stream_%v/playlist.m3u8

バッチ圧縮スクリプト

ディレクトリ内の全動画を処理:

#!/bin/bash
# 批量压缩目录下所有视频
for f in *.mp4; do
  ffmpeg -i "$f" \
    -c:v libx264 -crf 23 -preset medium \
    -c:a aac -b:a 128k \
    -movflags +faststart \
    "compressed_${f}"
done

FFHub でのクラウド圧縮

このガイドのコマンドは FFHub.io にそのまま投げて動きます:

# Compress a video in the cloud (no local FFmpeg needed)
curl -X POST https://api.ffhub.io/v1/tasks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "command": "ffmpeg -i https://example.com/input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -movflags +faststart output.mp4"
  }'

CPU を食うエンコードをクラウド側に逃がせるので、ローカルやアプリサーバーが楽になります。バッチ動画変換 や、アプリサーバーで FFmpeg を回すとパフォーマンスに響くケースで特に有効です。

クイックリファレンス

一行コマンド集

# Good default compression
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k -movflags +faststart output.mp4

# Aggressive compression (smaller file)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4

# High-quality compression (larger file)
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow -c:a aac -b:a 192k output.mp4

# Maximum compression with H.265
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4

# Future-proof with AV1
ffmpeg -i input.mp4 -c:v libsvtav1 -crf 30 -preset 6 -c:a libopus -b:a 128k output.mp4

判断ツリー

  1. 最大互換性が要る? H.264 を使う
  2. ファイルを小さくしたい? H.265(Apple/モバイル)か VP9(Web)
  3. 最小サイズで時間に余裕がある? AV1
  4. 目標サイズが決まってる? 2-pass エンコード
  5. 品質を一定にしたい? CRF
  6. 大量処理? fastveryfast
  7. 重要な 1 本? slow プリセット

まとめ

効果的な動画圧縮は、結局のところ品質(CRF)・速度(プリセット)・サイズ(コーデック選択)の 3 つのバランス。デフォルト(CRF 23、medium、H.264)から始めて、要件に応じて調整するのが王道です。実コンテンツでテストすること——トーキングヘッド動画とアクションシーンでは圧縮挙動がまったく違うので。

ここに載せたコマンドはすべて標準 FFmpeg。ローカル、サーバー、FFHub みたいなクラウドサービス、どこでも動きます。基本を押さえれば、任意の動画圧縮シナリオに対応できます。

Try it in your browser

本番パイプラインに組み込む前に、CRF / preset / コーデックの組み合わせを実コンテンツで検証。同じ FFmpeg フラグが裏で動きます。

よくある質問(FAQ)

ストリーミング動画には CRF をいくつにする?

HLS / DASH のアダプティブストリーミングなら CRF 21–23 と -maxrate-bufsize の上限併用が標準です。CRF で複雑なシーンでも品質を保ち、ビットレート上限で視聴者のバンド幅を保護します。最高品質バリアントは CRF 23、中品質は CRF 24–25、最低品質は CRF 26–28。

2-pass エンコードと CRF、いつどちらを使う?

画質の一貫性が大事なら CRF(Web / アーカイブ用途のほぼ全て)。指定サイズに収める必要があるなら 2-pass(Discord の 25MB 上限、放送規格、広告仕様など)。2-pass は CRF の約 2 倍時間がかかりますが、サイズを精密に制御できます。画質優先でビットレート上限が必要なら、CRF と -maxrate-bufsize の組み合わせが折衷案。

H.265 が H.264 よりずっと遅いのはなぜ?

H.265 は 30–40% の圧縮率優位を達成するために、フレームごとに より多くのブロックサイズ・予測モード・動きベクトルを評価します。HEVC 規格は H.264 より仕様上複雑で、複雑度と効率のトレードオフです。実測で libx265 -preset medium は同品質出力で libx264 -preset medium より 3–5 倍遅くなります。

AV1 は 2026 年に本番運用できる?

配信側は可能、ただし注意点あり。AV1 ハードウェアデコーダはフラッグシップスマホ、現行ゲーム機、Apple Silicon に普及していますが、古いデバイスは H.264 フォールバックが必要。エンコード側では SVT-AV1libsvtav1)が実用的選択 —— 同品質で H.264 より 3–8 倍遅い、libaom-av1 の 20–50 倍遅いと比べたら使える速度。Netflix、YouTube、Vimeo はすでに対応クライアントに AV1 ストリームを配信しています。

異なるソースの動画をバッチ圧縮して画質を揃えるには?

CRF モードを使い、bitrate モードは使わない —— CRF は各ソースの複雑度に自動適応します。シンプルなシェルループ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -movflags +faststart で混在入力に対して体感品質が揃った出力を生成。ファイルサイズの上限が必要なら -maxrate-bufsize を上乗せ(例:-maxrate 4M -bufsize 8M)。

-preset slow で本当にファイルが小さくなる?

なります、ただし収益逓減。mediumslow同品質下 ~6% サイズ削減、エンコード時間 ~70% 増mediumveryslow で ~14% 削減、エンコード時間 6.4 倍。placeboveryslow とほぼ同等 —— placebo は使わない。実用的スイートスポット:medium(デフォルト)、slow(夜間バッチ、本番配信)、fast(リアルタイムやプロキシ用途)。

関連記事

FFmpeg 動画圧縮のベストプラクティス——実測で見る完全ガイド | FFHub