H.265/HEVC (High Efficiency Video Coding) ofrece la misma calidad visual que H.264 con archivos un 40–50 % más pequeños. FFmpeg con el encoder libx265 es la forma más potente de aprovechar este códec desde línea de comandos.
| Códec |
Año |
Compresión |
Velocidad |
Compatibilidad |
| H.264 (libx264) |
2003 |
Buena |
Muy rápida |
Universal |
| H.265 (libx265) |
2013 |
Muy buena |
Media |
Amplia |
| AV1 (libaom) |
2018 |
Excelente |
Lenta |
Creciente |
ffmpeg -i entrada.mp4 -c:v libx265 -c:a copy salida_h265.mp4
ffmpeg -i entrada.mp4 -c:v libx265 -crf 28 -c:a copy salida.mp4
ffmpeg -i entrada.mp4 -c:v libx265 -crf 24 -preset medium -c:a aac -b:a 128k salida.mp4
| Rango CRF |
Uso |
| 18–20 |
Archivos máster, sin pérdida apreciable |
| 21–26 |
Distribución online alta calidad |
| 27–32 |
Streaming general |
| 33–40 |
Móvil, ancho de banda muy limitado |
ffmpeg -i entrada.mp4 -c:v libx265 -crf 23 crf23.mp4
ffmpeg -i entrada.mp4 -c:v libx265 -crf 28 crf28.mp4 # defecto
ffmpeg -i entrada.mp4 -c:v libx265 -crf 35 crf35.mp4
# ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
ffmpeg -i entrada.mp4 -c:v libx265 -crf 28 -preset medium salida.mp4
ffmpeg -i entrada.mp4 -c:v libx265 -crf 28 -preset slow salida.mp4
# NVIDIA NVENC
ffmpeg -i entrada.mp4 -c:v hevc_nvenc -cq 28 -preset p4 salida_nvenc.mp4
# Intel Quick Sync
ffmpeg -i entrada.mp4 -c:v hevc_qsv -global_quality 28 salida_qsv.mp4
# Apple VideoToolbox (M1/M2/M3)
ffmpeg -i entrada.mp4 -c:v hevc_videotoolbox -q:v 60 salida_mac.mp4
# Ver encoders disponibles
ffmpeg -encoders 2>/dev/null | grep hevc
#!/bin/bash
mkdir -p output_h265
for f in *.mp4; do
nombre="${f%.mp4}"
ffmpeg -i "$f" -c:v libx265 -crf 26 -preset medium \
-c:a aac -b:a 128k -movflags +faststart \
"output_h265/${nombre}_h265.mp4" -y
done
import subprocess
from pathlib import Path
def comprimir_h265(entrada, salida, crf=26, preset='medium'):
cmd = ['ffmpeg', '-i', str(entrada),
'-c:v', 'libx265', '-crf', str(crf), '-preset', preset,
'-c:a', 'aac', '-b:a', '128k', '-movflags', '+faststart',
str(salida), '-y']
resultado = subprocess.run(cmd, capture_output=True, text=True)
return resultado.returncode == 0
for video in sorted(Path('videos/').glob('*.mp4')):
salida = Path('h265') / video.name
salida.parent.mkdir(exist_ok=True)
ok = comprimir_h265(video, salida)
if ok:
orig = video.stat().st_size / 1024 / 1024
comp = salida.stat().st_size / 1024 / 1024
print(f"OK: {video.name} → {orig:.1f}MB → {comp:.1f}MB ({(1-comp/orig)*100:.0f}% menos)")