できること
MP4ファイルをスマートなデフォルト設定で再エンコードし、ファイルサイズを削減します。重要なポイント:ほとんどのスクリーンキャストやトーキングヘッド動画は60fpsで過剰にエンコードされています。30fpsに落とし、エンコーダをチューニングすることで、知覚できる品質の差なく20〜50%のファイルサイズ削減を実現します。
バンドルスクリプト: @compress_video.py
使用するタイミング
- 共有/アップロードするには大きすぎるMP4があるとき
- 60fpsで録画したスクリーンキャストを半分に削減したいとき
- 「十分な品質」を小さなサイズで得たいとき
- トレーニング動画、デモ、録画を一括圧縮したいとき
使い方
CLI(クイック)
# 分析のみ
python compress_video.py input.mp4 --probe-only
# デフォルト圧縮(高品質)
python compress_video.py input.mp4 output.mp4
# ファイルを小さくするためのアグレッシブ圧縮
python compress_video.py input.mp4 -p aggressive
# スクリーンキャスト(コード/EDAツール): 60→30fps、stillimageチューン
python compress_video.py input.mp4 -p balanced --tune stillimage --fps 30
# 1080pにダウンスケール
python compress_video.py input.mp4 -p balanced --resolution 1920x1080
Python API
from compress_video import compress, probe
# まずプローブ
info = probe("input.mp4")
print(f"{info['width']}x{info['height']} @ {info['fps']:.0f}fps")
# デフォルトで圧縮
compress("input.mp4", "output.mp4")
# アグレッシブ設定で圧縮
compress("input.mp4", "output.mp4", profile="aggressive",
fps=24, tune="stillimage")
必要条件
- Python 3.8+
- ffmpeg がインストールされ、PATHが通っていること(
ffprobeを含む)
圧縮プロファイル
| プロファイル | x264 CRF | x265 CRF | 使用用途 |
|---|---|---|---|
lossless | 18 | 20 | アーカイブ、最大品質 |
high(デフォルト) | 23 | 25 | 視覚的にロスレス、安全なデフォルト |
balanced | 26 | 28 | 良好な品質、小さなファイル |
aggressive | 28 | 30 | 小さなファイル、軽微なグラデーション損失あり |
主要な戦略
| テクニック | 典型的な削減率 | 品質への影響 |
|---|---|---|
| 60fps → 30fps | ~25% | スクリーンキャストでは知覚不可 |
| H.264 CRF 23(CRF 18から) | ~20% | ほとんどの視聴者には違いなし |
| H.264 → H.265 (libx265) | ~30-40% | なし(同じCRF) |
--tune stillimage | ~5-10% | コード/スライドに最適 |
| ダウンスケール 3200→1920 | ~50% | 拡大時にシャープネス低下 |
使用例
125MBのスクリーンキャストを30〜50%削減
# クイックデフォルト実行(libx264使用、60→30fpsに低下)
python compress_video.py recording.mp4 recording_compressed.mp4
# 125 MB → 97 MB (-22%)
# stillimageチューン使用(コード/スクリーンキャストに最適)
python compress_video.py recording.mp4 -p balanced --tune stillimage --fps 30
# 125 MB → ~80 MB (-35%)
# フルHEVC、遅いプリセット
python compress_video.py recording.mp4 --codec h265 --preset slow --fps 30
# 125 MB → ~60 MB (-50%、ただしエンコードは遅い)
フォルダ内の一括処理
Get-ChildItem *.mp4 | ForEach-Object {
python compress_video.py $_.Name "$($_.BaseName)_compressed.mp4"
}