メールで送れないほど大きい動画や、SNSへのアップロードに20分もかかる動画は、FFmpeg の 1 コマンドで小さくできます。

下記の環境での実測では、1080p の素材を H.264 CRF 23 で圧縮すると 29.3MB → 7.12MB(-75.7%、VMAF 93.29) になりました。

コマンド例

1. 基本:CRFモードでH.264圧縮(最も汎用的)

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
  • -c:v libx264 … H.264コーデックでエンコード
  • -crf 23 … 品質(0〜51。デフォルト23。数値が小さいほど高品質)
  • -preset medium … エンコード速度と圧縮率のバランス
  • -c:a aac -b:a 128k … 音声をAAC 128kbpsで再エンコード

2. H.265(HEVC)で高圧縮

下記の実測では、VMAFをそろえて比べるとH.264より 26〜35% 小さく、所要時間は約2倍でした(測定と補間の詳細)。他の素材や設定で同じ差になる保証はなく、VMAFが同じでも見た目の画質が完全に一致するわけではありません。

ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4

3. SNS・メール送信向け(小サイズ優先)

# ファイルサイズを最優先で削減(画質の劣化が目立つ)
ffmpeg -i input.mp4 -c:v libx264 -crf 32 -preset fast -vf scale=1280:-2 -c:a aac -b:a 96k output.mp4
  • -crf 32 … 品質を下げてサイズを優先
  • -vf scale=1280:-2 … 横幅1280pxにリサイズ(縦は偶数に自動調整)
  • -b:a 96k … 音声ビットレートも下げる

4. 保存用(高画質・時間をかける)

H.265 と遅い preset で、時間をかけて高画質に保存します。

ffmpeg -i input.mp4 -c:v libx265 -crf 22 -preset slow -c:a aac -b:a 192k output.mp4

5. ビットレート指定でサイズを制御

ファイルサイズを予測しやすくしたい場合に使います。-b:v は平均の目標値なので、場面によってはこれを超えます。配信プラットフォームのビットレート上限を守るには、-maxrate と -bufsize も指定します(例:-maxrate 2000k -bufsize 4000k)。

# 映像2Mbps + 音声128kbps = 合計約2.1Mbps
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -c:a aac -b:a 128k output.mp4

6. 2パスエンコード(最も精確なサイズ制御)

目標ファイルサイズに最も正確に近づける方法です。

# パス1: 映像分析(出力なし)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 1 -an -f null /dev/null

# パス2: 実際の出力
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 2 -c:a aac -b:a 128k output.mp4

パス1の出力(ffmpeg2pass-0.log)はパス2終了後に削除して構いません。

実測データ

次の値は、下記の環境でエンコードして測ったものです。VMAFは画質の推定指標で、100点でも画素の完全一致や、見た人全員が同じ評価をすることを示すものではありません。同じモデル・解像度・比較条件で使い、実画像も確認してください。VMAF公式FAQでは、同じ動画同士でも100点になる保証はないと説明されています。

H.264 と H.265 の出力サイズと VMAF 画質スコアの関係を示した実測グラフ。VMAF が同じなら H.265 は 26〜35% 小さい

横軸が出力サイズ、縦軸が VMAF。左上に寄っているほど「小さくて高画質」で優秀です。点の数字は CRF 値。以下の表が同じデータの実数値です。

項目 内容
CPU / GPU Intel Core i9-14900KF / NVIDIA RTX 4090
FFmpeg 8.1(gyan.dev full build)
素材 Big Buck Bunny 1920x1080 / 30fps / 10.0秒 / H.264 24.6Mbps / 29.3MB(音声なし)
素材の権利 © Blender Foundation, CC BY 3.0
測定日 2026-08-28
サイズの単位 1 MB = 1,048,576 バイト

H.264 の CRF 別(-preset medium)

CRF サイズ 元比 VMAF 所要時間
20 11.38 MB -61.1% 95.11 2.23 秒
23 7.12 MB -75.7% 93.29 2.05 秒
26 4.52 MB -84.6% 90.51 1.89 秒
28 3.38 MB -88.4% 87.83 1.82 秒
30 2.55 MB -91.3% 84.28 1.77 秒
32 1.96 MB -93.3% 79.70 1.76 秒

H.265 の CRF 別(-preset medium)

CRF サイズ 元比 VMAF 所要時間
22 7.96 MB -72.8% 94.86 4.68 秒
25 4.94 MB -83.1% 92.94 4.07 秒
28 3.04 MB -89.6% 90.03 3.52 秒
30 2.20 MB -92.5% 87.27 3.41 秒
32 1.60 MB -94.5% 83.53 3.28 秒
34 1.14 MB -96.1% 78.49 3.33 秒

この素材はアニメーションです。 素材が違えば、同じ CRF でもサイズは変わります。ノイズや速い動きが多いほど大きくなります。上の表は、傾向とおおよその規模をつかむために使ってください。

自分の素材での目安は、解像度・再生時間・CRF 値をファイルサイズ推定ツールに入れると、エンコードする前に確認できます。

CRF値の目安

CRF値 体感品質 用途 H.264ファイルサイズ目安
15〜17 透明(視覚的ロスレスに近い) 映像制作マスター 元ファイルの60〜80%
18〜20 非常に高品質 YouTube投稿・映像アーカイブ 元ファイルの40〜60%
21〜23 高品質(デフォルト) 一般共有・Web公開 元ファイルの25〜40%
24〜26 中品質 SNS・プレビュー 元ファイルの15〜25%
27〜30 やや劣化が見える メール添付・軽量共有 元ファイルの8〜15%
31〜35 劣化が目立つ 最小サイズ優先 元ファイルの4〜8%

注意: 数値はコンテンツ(アクション映像、アニメ、静止画多め等)により大きく変わります。上の実測では、CRF 20 が元ファイルの39%、CRF 23 が24%でした。必ず実際の出力で確認してください。

「コンテンツにより変わる」を実測した

どれくらい変わるのかを、同じ素材・同じ -crf 23 -preset medium のまま、素材の側だけを加工して測りました。

同じ H.264 CRF 23 でも素材によって出力サイズが変わることを示した実測グラフ。粒子を加えた素材だけが元ファイル 29.3MB を超えて 55.89MB になる

素材の状態 出力サイズ VMAF 元ファイル比
そのまま 7.12 MB 93.29 24%
粒子(grain)を加えた 55.89 MB 88.41 191%
軽くぼかした 4.40 MB 73.57 15%
720p に縮小 3.40 MB 82.23 12%

CRF を 1 も動かしていないのに、出力は 3.40MB 〜 55.89MB(16.4 倍) に開きました。読み取れることは 3 つです。

  • ノイズは「圧縮したのに小さくならない/逆に大きくなった」の原因になります。 粒子を加えただけで元ファイルの 191% になりました。フィルム粒子、高 ISO の暗所撮影、古いビデオテープの取り込みが該当します。CRF を上げる前に、-vf hqdn3d などでノイズを落とす方法も試せます。
  • ぼかすとサイズは減るが VMAF も落ちます。 4.40MB まで縮む代わりに VMAF は 73.57 まで下がりました。VMAF は原画との差を測るので、ぼかしは「軽くなった」ではなく「劣化した」と判定されます。サイズだけで判断しないでください。
  • 解像度を落とすほうが素直に効きます。 720p 化は 3.40MB / VMAF 82.23 で、ぼかしより小さくかつ高スコアでした。同じサイズを狙うなら、ぼかすより縮小するほうが有利です。

つまり CRF の数字を詰めるより、素材のノイズと解像度を先に見るほうが効きます。

-preset 比較

同じ CRF 値でも preset が異なるとファイルサイズと処理時間が変わります。「品質はほぼ同等」とよく言われますが、実測すると VMAF は 88.09〜94.26 まで開きます。

H.264 CRF 23 の preset 別実測。上段が VMAF、下段が出力サイズ。ultrafast だけが元ファイル 29.3MB より大きい 37.4MB になる

とくに ultrafast は最速(0.88秒)ですが、出力が元ファイルより大きくなります。「とにかく速く」で選ぶと圧縮になりません。

preset エンコード速度 ファイルサイズ 用途
ultrafast 最速 最大(CRFモードでは非効率) リアルタイム処理
veryfast 非常に速い 小さめ(実測 −31.6%)。画質は下がる ライブ変換・テスト
fast 速い やや小さめ(実測 −2.9%) 素早い変換が必要な場合
medium 標準(デフォルト) バランス 一般用途
slow 遅い medium とほぼ同じ(実測 +0.3%) 品質をわずかに上げたいとき
slower 非常に遅い medium とほぼ同じ(実測 +1.9%) アーカイブ
veryslow 最遅 わずかに小さい(実測 −7.0%) 最高効率が必要な場合

preset の実測(H.264 CRF 23 固定・同上の環境)

preset サイズ VMAF 所要時間
ultrafast 37.40 MB 91.70 0.88 秒
veryfast 4.87 MB 88.09 1.10 秒
fast 6.91 MB 92.44 1.77 秒
medium 7.12 MB 93.29 2.03 秒
slow 7.14 MB 93.49 3.26 秒
slower 7.26 MB 93.84 5.34 秒
veryslow 6.62 MB 94.26 8.65 秒

測ってみると、よく言われている話といくつか食い違いました。

  • medium → slow でファイルは小さくなりませんでした。 7.12MB → 7.14MB(+0.3%)で、増えたのは所要時間だけです(1.61 倍)。slow にしても「同じ品質でより小さく」ではなく「ほぼ同じサイズでわずかに高品質」(VMAF 93.29 → 93.49)になりました。サイズ削減を期待して slow を選ぶのは、少なくともこの素材では割に合いませんでした。
  • ultrafast は元ファイルより大きくなりました。 29.3MB の素材から 37.40MB です。CRF 23 でも ultrafast は圧縮効率を大きく捨てるため、「とりあえず速く」で選ぶとサイズが逆に増えることがあります。
  • 「preset を変えても品質はほぼ同等」も正確ではありません。 同じ CRF 23 で VMAF は 88.09〜94.26 と 6 ポイント以上開きました。CRF は preset をまたいで品質を一定に保つ値ではありません。

推奨: 一般用途は medium。それより遅い preset は、品質をわずかに上げたいときに選びます。小さくなったのは veryslow(−7.0%)だけで、時間は medium の4倍以上かかりました。

H.264 vs H.265 どちらを選ぶか

比較項目 H.264 (libx264) H.265 (libx265)
互換性 ほぼすべての環境(スマホ・TV・Web) 中程度(古いAndroid・一部ブラウザ非対応)
圧縮効率 標準 同一 VMAF で H.264 比 26〜35%小さい(実測。下記参照)
エンコード速度 速い 同 preset で H.264 の 約1.9倍遅い(実測)
ソフトウェア再生 非常に広く対応 対応済みだが一部プレイヤーは追加コスト
推奨CRF 18〜28 20〜30(上の実測では、H.264より2ほど高い値でほぼ同じVMAF)
おすすめシーン Web公開・SNS・不特定多数が閲覧 個人保存・ストレージ節約・対応確認済み環境

「H.265 は 40〜50% 小さい」は本当か

よく見る数字ですが、実測では 26〜35% でした。H.264 と H.265 を同じ CRF 値で比べても意味がない(CRF の尺度が違う)ため、両方の CRF を変えて測り、VMAF が同じ点どうしで比べています。H.264 側の値は、CRF ごとの測定値を線形補間したものです。

VMAF H.265 同品質の H.264 H.265 が小さい割合
83.53 1.60 MB 2.46 MB 34.9%
87.27 2.20 MB 3.25 MB 32.4%
90.03 3.04 MB 4.32 MB 29.5%
92.94 4.94 MB 6.79 MB 27.2%
94.86 7.96 MB 10.80 MB 26.3%

品質を上げるほど H.265 の優位は縮みます(VMAF 83 で 34.9% → VMAF 95 で 26.3%)。「高品質で保存したいから H.265」という判断ほど、得られる削減幅は小さくなります。逆に、低ビットレートで配信する用途ほど H.265 が有利です。

解像度ダウンスケールとの組み合わせ

コーデック圧縮に加えて解像度を下げると、サイズを大きく減らせます。

# 4K → 1080p + H.265で保存
ffmpeg -i input_4k.mp4 -c:v libx265 -crf 26 -preset medium \
  -vf scale=1920:-2 -c:a aac -b:a 128k output_1080p.mp4

# 1080p → 720p + H.264(SNS向け)
ffmpeg -i input_1080p.mp4 -c:v libx264 -crf 26 -preset fast \
  -vf scale=1280:-2 -c:a aac -b:a 96k output_720p.mp4

-vf scale=1280:-2 の -2 は縦横比を保ちつつ高さを偶数に自動調整します(-1 だと奇数になり一部コーデックでエラーになる)。

音声ストリームの最適化

音声だけでもサイズ削減に貢献します。

# 音声を完全スキップ(映像のみ保存)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -an output.mp4

# 音声をモノラルに変換(会話中心の動画に有効)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -ac 1 -b:a 64k output.mp4

# 音声ビットレート別サイズ比較(128k: 約0.9MB/分、96k: 約0.7MB/分、64k: 約0.5MB/分)

オプション詳解

オプション 意味 推奨値
-c:v libx264 H.264コーデック指定 汎用性最高
-c:v libx265 H.265コーデック指定 高圧縮が必要な場合
-crf N 品質係数(0〜51) H.264: 18〜28、H.265: 20〜30
-preset NAME 速度vs圧縮率 medium(デフォルト)、画質を少し上げたいときは遅いpreset
-b:v Nk 映像ビットレート目標 720p: 1500k、1080p: 4000k、4K: 15000k
-b:a Nk 音声ビットレート ステレオ: 128k〜192k、会話: 64k〜96k
-vf scale=W:H 解像度変更 -vf scale=1280:-2(幅指定・高さ自動)
-movflags +faststart MP4の先頭にmoovを移動 Web配信で再生開始を早くする(推奨)

トラブルシューティング

エラー1: Unknown encoder 'libx265'

原因: FFmpegがlibx265なしでビルドされている。
解決策: ffmpeg -h encoder=libx265 で確認します。Codec 'libx265' is not recognized by FFmpeg. と表示されたら、libx265入りのビルドを入れ直します。

# Homebrew (macOS)
brew install ffmpeg

# aptでフル版インストール (Ubuntu)
sudo apt install ffmpeg

エラー2: エンコードが終わらない / 非常に遅い

原因: -preset veryslow や -preset slow を高解像度動画に使っている。
解決策: preset を medium または fast に変更。H.265の場合はH.264より本質的に遅いため、用途を再検討。

エラー3: 出力ファイルサイズが期待より大きい

原因: -crf が低すぎる、または preset が ultrafast で圧縮効率が低い。
解決策: CRFを2〜4上げ、preset は medium にします。上の実測では、medium より遅い preset にしてもファイルはあまり小さくなりませんでした。

# CRFを2〜4上げ、presetはmedium
ffmpeg -i input.mp4 -c:v libx264 -crf 26 -preset medium -c:a aac -b:a 128k output.mp4

エラー4: width not divisible by 2 / height not divisible by 2

原因: scale フィルタで出力解像度の横幅または縦幅が奇数になっている(例: 素材によっては scale=1280:-1 で 1280x719 になる)。
解決策: 自動で計算させる側を -2 にします(-vf scale=1280:-2 や -vf scale=-2:720)。-2 にすると偶数に丸められます。

エラー5: 2パスのパス1が終わっているのに出力ファイルがない

原因: パス1は意図的に出力しない(-f null /dev/null)のが正常動作。
解決策: パス2のコマンドを続けて実行してください。パス1の役割は分析データ(ffmpeg2pass-0.log)の生成のみです。

FAQ

Q1. CRFモードとビットレートモード、どちらが良いですか?
A. ほとんどの用途ではCRFモードが推奨です。品質を一定に保ちながら効率よく圧縮できます。ビットレートモードはファイルサイズを厳密にコントロールする必要がある場合(配信プラットフォームの上限対応など)に使います。

Q2. CRF 23はどんな動画でも良い設定ですか?
A. いいえ。CRF 23はデフォルト値ですが最適値ではありません。アクション映像(動きが多い)はCRF 20前後、アニメ(均一な色面が多い)はCRF 18〜22が良い場合があります。必ず実際の出力を確認して調整してください。

Q3. 音声はコピーすべきですか?再エンコードすべきですか?
A. 品質を落としたくなければ -c:a copy。ファイルサイズも下げたければ -c:a aac -b:a 128k(音声を再エンコード)。元が高ビットレートのAACやMP3なら再エンコードでわずかに品質が落ちます。

Q4. MacではGPUエンコードできますか?
A. はい。Apple Silicon/Intel Mac では VideoToolbox が使えます。

ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 4000k -c:a aac output.mp4

-crf は使えないため、-b:v でビットレートを指定します(VBRモードになる)。Apple Silicon の Mac では、-q:v(1〜100、大きいほど高画質)で画質を指定することもできます。

Q5. バッチ処理でフォルダ内の全動画を圧縮するには?

for f in *.mp4; do
  ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k "compressed_${f}" -y
done

関連記事