「動画ファイルが大きすぎてメールで送れない」「SNSアップロードに20分もかかる」——そんな悩みはFFmpegの1コマンドで解決できます。CRFモードを使えば品質を維持したままファイルサイズを50〜80%削減できます。この記事では、ユースケース別の最適コマンドと設定値の根拠を徹底解説します。所要時間:15分。

動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)


この記事でわかること

  1. CRFモード(固定品質)とビットレートモードの違いと使い分け
  2. H.264 vs H.265 どちらを選ぶか
  3. CRF値・プリセット別の品質・サイズ・速度の比較表
  4. 解像度ダウンスケールとの組み合わせ
  5. 音声ストリームの最適化
  6. 2パスエンコードでファイルサイズを正確に制御
  7. よくあるエラーと解決策5件
  8. FAQ 5問

コマンド例

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)で高圧縮

H.264比で同等品質なら約40〜50%小さいファイルが得られます(エンコードは遅め)。

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. アーカイブ用(高品質・小サイズ)

時間をかけて最高効率のエンコードを行います。

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

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

ファイルサイズを厳密にコントロールしたい場合(配信プラットフォームのビットレート上限など)。

# 映像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終了後に削除してOKです。


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%

注意: 数値はコンテンツ(アクション映像、アニメ、静止画多め等)により大きく変わります。必ず実際の出力で確認してください。


-preset 比較

同じ CRF 値でも preset が異なるとファイルサイズと処理時間が変わります(品質はほぼ同等)。

presetエンコード速度ファイルサイズ用途
ultrafast最速最大(CRFモードでは非効率)リアルタイム処理
veryfast非常に速い大きめライブ変換・テスト
fast速いやや大きめ素早い変換が必要な場合
medium標準(デフォルト)バランス一般用途
slow遅い小さめYouTube投稿・保存用
slower非常に遅い小さいアーカイブ
veryslow最遅最小最高効率が必要な場合

実用的な推奨: 一般用途は medium、時間に余裕があれば slow で同じ品質をより小さく。

実測メモ(Ubuntu 22.04 + FFmpeg 6.1、1080p 5分の素材): preset=mediumslow に変えたところ、ファイルサイズが23%縮小。処理時間は 3.1倍になった。夜間バッチなら slow、即座に確認したいなら medium で十分。


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

比較項目H.264 (libx264)H.265 (libx265)
互換性ほぼすべての環境(スマホ・TV・Web)中程度(古いAndroid・一部ブラウザ非対応)
圧縮効率標準H.264比で約40〜50%小さい
エンコード速度速いH.264の2〜4倍遅い
ソフトウェア再生非常に広く対応対応済みだが一部プレイヤーは追加コスト
推奨CRF18〜2824〜34(同等品質でH.264より5高い傾向)
おすすめシーンWeb公開・SNS・不特定多数が閲覧個人保存・ストレージ節約・対応確認済み環境

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

コーデック圧縮に加えて解像度を下げると劇的なサイズ削減になります。

# 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: 約5.6MB/分、96k: 約4.2MB/分、64k: 約2.8MB/分)

オプション詳解

オプション意味推奨値
-c:v libx264H.264コーデック指定汎用性最高
-c:v libx265H.265コーデック指定高圧縮が必要な場合
-crf N品質係数(0〜51)H.264: 18〜28、H.265: 24〜34
-preset NAME速度vs圧縮率medium(デフォルト)、保存用はslow
-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 +faststartMP4の先頭にmoovを移動Web配信・ストリーミング用途に必須

トラブルシューティング

エラー1: Encoder libx265 not found

原因: FFmpegがH.265エンコードサポートなしでビルドされている。
解決策: ffmpeg -codecs | grep hevc で確認。E がない場合は公式バイナリを再インストール。

# 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 が ultrafastveryfast で圧縮効率が低い。
解決策:

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

エラー4: width not divisible by 2

原因: scale フィルタで出力解像度の横幅または縦幅が奇数になっている。
解決策: -vf scale=1280:-2(末尾を -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モードは使えない(VBRモードになる)ため、-b:v でビットレートを指定します。

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

関連記事


動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg.html / ffmpeg.org/ffmpeg-codecs.html / ffmpeg.org/ffmpeg-filters.html