Skip to content

動画圧縮完全ガイド:原理からFFmpeg実践まで

ビデオを圧縮したいが、品質を保ちたい。CRFとビットレートの違いは?H.264とH.265のどちらを使うべき?これらの疑問は動画圧縮に取り組む際によくあります。原理を理解すれば、FFmpegパラメータが魔法の呪文ではなく、合理的な選択になります。このガイドでは、動画圧縮の根本から実践までをカバーします。

なぜ動画を圧縮できるのか

動画の実体は「連続した画像フレーム」。1秒間に24-60フレーム。非圧縮の1080p 60fpsビデオは約3 Gbpsの帯域幅を必要とし、1分で22 GBになります。こんな巨大的なデータがYouTubeでスムーズに再生できるのは、非可逆圧縮が人間の視覚の特性を利用しているからです。

人間の視覚の3つの特性

  1. 明るさに敏感、色に鈍感:人間は明るさの変化に敏感ですが、色の変化には鈍感です。YUV 4:2:0は色情報を半分にサンプリングし、データを50%削減
  2. 静的なものに敏感、動的なものに鈍感:静止背景は高画質、動くオブジェクトは低画質でも許容されます
  3. 高周波数のディテールに鈍感:エッジやテクスチャの細部はぼかしても気づかれません

現代の動画圧縮はこの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
VP92013優秀(H.265相当)遅いChrome、FirefoxYouTube、WebM
AV12018最高(H.265より20-30%小さい)非常に遅いモダンブラウザ次世代ストリーミング

詳細な比較はH.264 vs H.265 vs AV1コーデック比較ガイド をご覧ください。

FFmpeg圧縮実践

CRFモード(品質優先)

bash
# 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.mp4

CRF値参考:

CRF値品質ファイルサイズ使用ケース
18視覚的にロスレス高品質アーカイブ
23(H.264デフォルト)良い一般使用
28(H.265デフォルト)良いウェブ用
32許容可能非常に小さいモバイル用

ビットレートモード(サイズ優先)

bash
# 固定ビットレート(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最遅最高最終納品

解像度の変更

bash
# 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

フレームレートの変更

bash
# 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

用途別圧縮テンプレート

ウェブ用動画

bash
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:ウェブでプログレッシブ再生可能

モバイル用動画

bash
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

アーカイブ用動画

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

4K動画の圧縮

bash
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を使用

圧縮前後の品質比較

bash
# 元ビデオのビットレートを確認
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%削減、遅いエンコード)

覚えておくべき基本テンプレート:

bash
# 汎用圧縮(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

参考文献

最終更新: