내 역할
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% | 확대 시 선명도 저하 |
예제
125 MB 스크린캐스트를 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"
}