「動画ファイルが大きすぎてメールで送れない」「SNSアップロードに20分もかかる」——そんな悩みはFFmpegの1コマンドで解決できます。CRFモードを使えば品質を維持したままファイルサイズを50〜80%削減できます。この記事では、ユースケース別の最適コマンドと設定値の根拠を徹底解説します。所要時間:15分。
動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI検証済み)
この記事でわかること
- CRFモード(固定品質)とビットレートモードの違いと使い分け
- H.264 vs H.265 どちらを選ぶか
- CRF値・プリセット別の品質・サイズ・速度の比較表
- 解像度ダウンスケールとの組み合わせ
- 音声ストリームの最適化
- 2パスエンコードでファイルサイズを正確に制御
- よくあるエラーと解決策5件
- 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=medium→slowに変えたところ、ファイルサイズが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倍遅い |
| ソフトウェア再生 | 非常に広く対応 | 対応済みだが一部プレイヤーは追加コスト |
| 推奨CRF | 18〜28 | 24〜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 libx264 | H.264コーデック指定 | 汎用性最高 |
-c:v libx265 | H.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 +faststart | MP4の先頭に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 が ultrafast〜veryfast で圧縮効率が低い。
解決策:
# 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