動画圧縮完全ガイド:原理からFFmpeg実践まで
ビデオを圧縮したいが、品質を保ちたい。CRFとビットレートの違いは?H.264とH.265のどちらを使うべき?これらの疑問は動画圧縮に取り組む際によくあります。原理を理解すれば、FFmpegパラメータが魔法の呪文ではなく、合理的な選択になります。このガイドでは、動画圧縮の根本から実践までをカバーします。
なぜ動画を圧縮できるのか
動画の実体は「連続した画像フレーム」。1秒間に24-60フレーム。非圧縮の1080p 60fpsビデオは約3 Gbpsの帯域幅を必要とし、1分で22 GBになります。こんな巨大的なデータがYouTubeでスムーズに再生できるのは、非可逆圧縮が人間の視覚の特性を利用しているからです。
人間の視覚の3つの特性
- 明るさに敏感、色に鈍感:人間は明るさの変化に敏感ですが、色の変化には鈍感です。YUV 4:2:0は色情報を半分にサンプリングし、データを50%削減
- 静的なものに敏感、動的なものに鈍感:静止背景は高画質、動くオブジェクトは低画質でも許容されます
- 高周波数のディテールに鈍感:エッジやテクスチャの細部はぼかしても気づかれません
現代の動画圧縮はこの3つの特性に基づいています。
三つの圧縮次元
1. 空間圧縮(フレーム内圧縮)
単一フレーム内の冗長性を削減、JPEG画像圧縮に似ています:
- DCT変換:ピクセルブロック(通常8x8)を周波数領域に変換
- 量子化:高周波数成分を破棄(人間が鈍感なディテール)
- エントロピー符号化:ハフマン符号化または算術符号化でさらに圧縮
2. 時間圧縮(フレーム間圧縮)
フレーム間の類似性を利用、これが動画圧縮の核心です:
- Iフレーム(キーフレーム):完全な画像を保存、圧縮率が低い
- Pフレーム(前方予測):前のフレームとの差分のみ保存
- Bフレーム(双方向予測):前後のフレームとの差分を保存、圧縮率が高い
典型的なGOP(Group of Pictures)構造:
I B B P B B P B B P B B P I B B P ...Iフレームは1つだけ完全な画像、残りは差分のみ。これでデータを大幅に削減できます。
3. 熵圧縮
可逆圧縮でさらにデータを削減:
- ハフマン符号化
- 算術符号化(CABAC/CAVLC)
- 実行長符号化
主要な動画コーデック比較
| コーデック | リリース年 | 圧縮効率 | エンコード速度 | ブラウザサポート | 使用ケース |
|---|---|---|---|---|---|
| H.264 (AVC) | 2003 | 良い | 速い | 普遍的 | 万能 |
| H.265 (HEVC) | 2013 | 優秀(H.264より30-50%小さい) | 遅い | 限定的 | アーカイブ、4K |
| VP9 | 2013 | 優秀(H.265相当) | 遅い | Chrome、Firefox | YouTube、WebM |
| AV1 | 2018 | 最高(H.265より20-30%小さい) | 非常に遅い | モダンブラウザ | 次世代ストリーミング |
詳細な比較はH.264 vs H.265 vs AV1コーデック比較ガイド をご覧ください。
FFmpeg圧縮実践
CRFモード(品質優先)
# H.264 CRF圧縮(推奨)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 128k output.mp4
# H.265 CRF圧縮(より小さい)
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset slow -c:a aac -b:a 128k output.mp4CRF値参考:
| CRF値 | 品質 | ファイルサイズ | 使用ケース |
|---|---|---|---|
| 18 | 視覚的にロスレス | 大 | 高品質アーカイブ |
| 23(H.264デフォルト) | 良い | 中 | 一般使用 |
| 28(H.265デフォルト) | 良い | 小 | ウェブ用 |
| 32 | 許容可能 | 非常に小さい | モバイル用 |
ビットレートモード(サイズ優先)
# 固定ビットレート(CBR)— ライブストリーミングに適している
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -maxrate 4M -bufsize 8M -c:a aac -b:a 128k output.mp4
# 可変ビットレート(VBR)— VODに適している
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -c:a aac -b:a 128k output.mp4プリセットの選択
| プリセット | エンコード速度 | 圧縮率 | 使用ケース |
|---|---|---|---|
| ultrafast | 最速 | 最悪 | ライブストリーミング |
| fast | 速い | 良い | クイックテスト |
| medium(デフォルト) | 中 | 良い | 一般使用 |
| slow | 遅い | より良い | アーカイブ |
| veryslow | 最遅 | 最高 | 最終納品 |
解像度の変更
# 720pにダウンスケール
ffmpeg -i input.mp4 -vf "scale=-1:720" -c:v libx264 -crf 23 -c:a aac output.mp4
# 480pにダウンスケール(モバイル用)
ffmpeg -i input.mp4 -vf "scale=-1:480" -c:v libx264 -crf 23 -c:a aac output.mp4フレームレートの変更
# 60fps → 30fps
ffmpeg -i input.mp4 -r 30 -c:v libx264 -crf 23 -c:a aac output.mp4
# 60fps → 24fps(シネマ風)
ffmpeg -i input.mp4 -r 24 -c:v libx264 -crf 23 -c:a aac output.mp4用途別圧縮テンプレート
ウェブ用動画
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -profile:v high -level 4.0 -pix_fmt yuv420p -movflags +faststart -c:a aac -b:a 128k output.mp4-profile:v high -level 4.0:互換性を保証-pix_fmt yuv420p:最も互換性の高い色空間-movflags +faststart:ウェブでプログレッシブ再生可能
モバイル用動画
ffmpeg -i input.mp4 -vf "scale=-1:720" -r 30 -c:v libx264 -crf 26 -preset slow -c:a aac -b:a 96k output.mp4アーカイブ用動画
ffmpeg -i input.mp4 -c:v libx265 -crf 20 -preset slow -c:a aac -b:a 192k output.mp44K動画の圧縮
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -x265-params "pool=0:frame-threads=0" -c:a aac -b:a 192k output.mp4よくある問題
1. 圧縮後に品質が著しく低下
原因: CRFが高すぎるか、ビットレートが低すぎる
解決策: CRFを下げる(23→18)かビットレートを上げる
2. エンコードが遅い
原因: プリセットが遅すぎるか、解像度が高すぎる
解決策: -preset mediumまたはfastを使用、解像度を下げる
3. ファイルサイズが予想より大きい
原因: ソースがすでに高圧縮、再エンコードで品質ロスのみ
解決策: H.265に切り替えるか、解像度を下げる
4. iPhoneで再生できない
原因: H.265使用またはピクセルフォーマットが非互換
解決策: H.264と-pix_fmt yuv420pを使用
圧縮前後の品質比較
# 元ビデオのビットレートを確認
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1 input.mp4
# 圧縮後のビットレートを確認
ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1 output.mp4
# PSNRで品質を測定(30dB以上が良い)
ffmpeg -i input.mp4 -i output.mp4 -filter_complex "psnr" -f null -
# VMAFで品質を測定(80以上が良い、Netflixの指標)
ffmpeg -i input.mp4 -i output.mp4 -filter_complex "libvmaf" -f null -詳細は動画メタデータ分析ガイド をご覧ください。
まとめ
動画圧縮の核心は、人間の視覚の特性を利用した非可逆圧縮です。FFmpegの実践では:
- 品質優先: CRFモード(H.264はCRF 23、H.265はCRF 28)
- サイズ優先: ビットレートモード(CBRまたはVBR)
- 互換性優先: H.264 + yuv420p + high profile
- 効率優先: H.265(サイズ30-50%削減、遅いエンコード)
覚えておくべき基本テンプレート:
# 汎用圧縮(90%のユースケースをカバー)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 128k output.mp4クイックリファレンス:
- CRF参考: H.264 18-28、H.265 23-32
- プリセット: 一般用
medium、アーカイブ用slow - 互換性: H.264 + yuv420p + high profile
- 圧縮効率: H.265 > VP9 > H.264