¿Alguna vez editaste un video y un clip se escucha bajísimo mientras el siguiente te revienta los parlantes? La inconsistencia de volumen es una de las quejas más comunes en producción de video — y uno de los temas más consultados en r/ffmpeg de Reddit y foros de ingeniería de audio.
El filtro loudnorm de FFmpeg normaliza el audio a un nivel de sonoridad objetivo siguiendo el estándar EBU R128. El comando básico es ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11 output.mp4 — esto lleva tu audio a -16 LUFS, que funciona para YouTube, Spotify y la mayoría de plataformas de streaming.
Esta guía cubre desde la normalización rápida en un solo paso hasta flujos de trabajo precisos de dos pasos, objetivos de sonoridad por plataforma y procesamiento por lotes con ffmpeg-normalize.
Lo que aprenderás
- Cómo funciona el filtro loudnorm y qué significa cada parámetro
- Normalización de un paso vs. dos pasos y cuándo usar cada una
- Objetivos de sonoridad para YouTube, Spotify, Apple, TikTok y transmisión
- Cómo normalizar por lotes con ffmpeg-normalize
- Cómo se compara loudnorm con volume, dynaudnorm y compand
Cómo funciona el filtro loudnorm
El filtro loudnorm mide la sonoridad percibida usando el algoritmo ITU-R BS.1770 (filtrado ponderado K con compuerta) y ajusta la ganancia para alcanzar un nivel objetivo. Internamente, sobremuestrea a 192 kHz para una detección precisa del pico verdadero, luego aplica un AGC ajustado con un limitador de pico verdadero con lookahead de 100 ms.
Normalización en un paso
La forma más simple de normalizar audio:
ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11 output.mp4
Qué hace cada parámetro:
| Parámetro | Significado | Rango | Por defecto |
|---|---|---|---|
I | Sonoridad integrada objetivo (LUFS) | -70.0 a -5.0 | -24.0 |
TP | Pico verdadero máximo (dBTP) | -9.0 a 0.0 | -2.0 |
LRA | Rango de sonoridad objetivo (LU) | 1.0 a 50.0 | 7.0 |
El modo de un paso usa normalización dinámica (no lineal) — el AGC ajusta la ganancia en tiempo real mientras procesa el audio. Funciona bien para trabajos rápidos y streaming en vivo, pero el resultado puede no ser perfectamente lineal porque el filtro no ha visto todo el archivo.
Medir la sonoridad antes de normalizar
Antes de normalizar, es útil verificar la sonoridad actual de tu archivo:
ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json -f null -
Esto genera un JSON con los valores medidos:
{
"input_i": "-27.61",
"input_tp": "-4.47",
"input_lra": "18.06",
"input_thresh": "-39.20",
"output_i": "-16.58",
"output_tp": "-1.50",
"output_lra": "14.78",
"output_thresh": "-27.71",
"normalization_type": "dynamic",
"target_offset": "0.58"
}
input_i indica la sonoridad integrada de la fuente. normalization_type muestra si se aplicó normalización lineal o dinámica.
Normalización en dos pasos para mayor precisión
La normalización en dos pasos primero mide todo el archivo y luego aplica la corrección exacta. Esto permite la normalización lineal — una ganancia constante aplicada uniformemente que preserva la dinámica original sin intervención del AGC.
Paso 1: Medir
ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json -f null - 2>&1
Guarda la salida JSON. Necesitas input_i, input_tp, input_lra, input_thresh y target_offset.
Paso 2: Aplicar
ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=-27.61:measured_LRA=18.06:measured_TP=-4.47:measured_thresh=-39.20:offset=0.58:linear=true -ar 48000 output.mp4
Los parámetros measured_* alimentan las mediciones del primer paso al filtro. linear=true solicita normalización lineal.
Automatizar dos pasos con un script de shell
Analizar JSON y ejecutar dos comandos manualmente se vuelve tedioso. Este script lo automatiza:
#!/bin/bash
# two-pass-normalize.sh — Normalizar audio al LUFS objetivo
INPUT="$1"
OUTPUT="$2"
TARGET_I=${3:--16}
TARGET_TP=${4:--1.5}
TARGET_LRA=${5:-11}
# Paso 1: medir
JSON=$(ffmpeg -i "$INPUT" -af "loudnorm=I=$TARGET_I:TP=$TARGET_TP:LRA=$TARGET_LRA:print_format=json" -f null - 2>&1 | sed -n '/{/,/}/p')
# Extraer valores medidos
measured_I=$(echo "$JSON" | grep '"input_i"' | sed 's/.*: "//;s/".*//')
measured_TP=$(echo "$JSON" | grep '"input_tp"' | sed 's/.*: "//;s/".*//')
measured_LRA=$(echo "$JSON" | grep '"input_lra"' | sed 's/.*: "//;s/".*//')
measured_thresh=$(echo "$JSON" | grep '"input_thresh"' | sed 's/.*: "//;s/".*//')
offset=$(echo "$JSON" | grep '"target_offset"' | sed 's/.*: "//;s/".*//')
# Paso 2: aplicar
ffmpeg -i "$INPUT" -af "loudnorm=I=$TARGET_I:TP=$TARGET_TP:LRA=$TARGET_LRA:measured_I=$measured_I:measured_LRA=$measured_LRA:measured_TP=$measured_TP:measured_thresh=$measured_thresh:offset=$offset:linear=true" -ar 48000 "$OUTPUT"
Uso:
chmod +x two-pass-normalize.sh
./two-pass-normalize.sh input.mp4 output.mp4 -16 -1.5 11
Para automatización más avanzada con Python, consulta Automatización de FFmpeg con Python.
Objetivos de sonoridad por plataforma
Cada plataforma normaliza el audio a diferentes niveles. Entregar audio que ya cumple con el objetivo evita que la plataforma aplique su propia normalización, lo cual puede introducir artefactos.
| Plataforma | LUFS objetivo | Pico verdadero | Notas |
|---|---|---|---|
| YouTube | -14 LUFS | -1.5 dBTP | Aplica normalización en reproducción |
| Spotify | -14 LUFS | -1 dBTP | Usa normalización estilo ReplayGain |
| Apple Music | -16 LUFS | -1 dBTP | Función Sound Check |
| Apple Podcasts | -16 LUFS | -1 dBTP | Mismo estándar que Apple Music |
| Amazon Music | -14 LUFS | -2 dBTP | Solo baja volumen, nunca sube |
| TikTok | ~-14 LUFS | -1 dBTP | Sin especificación oficial; consenso del sector |
| Instagram Reels | ~-14 LUFS | -1 dBTP | Meta gestiona vía xHE-AAC |
| EBU R128 (emisión) | -23 LUFS | -1 dBTP | Estándar europeo de emisión |
Fuente: EBU Tech R128, documentación de desarrolladores de plataformas y mediciones del sector.
Comandos listos para cada plataforma
YouTube / Spotify / TikTok (-14 LUFS):
ffmpeg -i input.mp4 -af loudnorm=I=-14:TP=-1.5:LRA=11 output.mp4
Apple Music / Podcasts (-16 LUFS):
ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1:LRA=11 output.mp4
Emisión (EBU R128, -23 LUFS):
ffmpeg -i input.mp4 -af loudnorm=I=-23:TP=-1:LRA=7 output.mp4
Normalización por lotes con ffmpeg-normalize
Para normalizar múltiples archivos, ffmpeg-normalize es un CLI de Python que envuelve el filtro loudnorm de FFmpeg con valores predeterminados sensatos y soporte de dos pasos integrado.
Instalación
pip install ffmpeg-normalize
Uso básico
# Normalizar un archivo a -16 LUFS (dos pasos, EBU R128)
ffmpeg-normalize input.mp4 -o output.mp4
# Normalizar a -14 LUFS para YouTube
ffmpeg-normalize input.mp4 -o output.mp4 -t -14
# Normalizar todos los MP4 en un directorio
ffmpeg-normalize *.mp4 -of normalized/ -ext mp4
Presets integrados (v1.36+)
# Podcast (estándar AES de streaming)
ffmpeg-normalize input.wav -o output.wav --preset podcast
# Música (basado en RMS)
ffmpeg-normalize input.wav -o output.wav --preset music
# Video de streaming
ffmpeg-normalize input.mp4 -o output.mp4 --preset streaming-video
Normalización de álbum (v1.35+)
Para mantener la sonoridad relativa entre pistas mientras llevas el álbum a un nivel objetivo:
ffmpeg-normalize track1.wav track2.wav track3.wav -of album/ -ext wav --album
Para flujos de trabajo más avanzados, consulta Automatización de FFmpeg con Python.
Comparación de filtros de audio
"¿Debería usar loudnorm o simplemente volume?" — esta pregunta aparece constantemente en Stack Overflow y foros de producción de audio. FFmpeg tiene varios filtros de ajuste de audio. Aquí está cuándo usar cada uno:
| Filtro | Método | Ideal para | Compensación |
|---|---|---|---|
| loudnorm | Sonoridad perceptual EBU R128 | Streaming, emisión, podcasts | Más preciso; sobremuestrea a 192 kHz |
| volume | Multiplicador de ganancia fijo | Ajustes simples ("subir volumen") | Sin conciencia de sonoridad; puede recortar |
| dynaudnorm | Ganancia dinámica por fragmento | Conversaciones, entrevistas | ~4x más rápido que loudnorm; sin cumplimiento de estándares |
| compand | Compresión de rango dinámico | Efectos de compresión fuertes | Puede distorsionar; sintaxis compleja |
Cuándo usar volume en lugar de loudnorm
Si solo necesitas subir o bajar el volumen en una cantidad conocida, volume es más simple y rápido:
# Aumentar 6 dB
ffmpeg -i input.mp4 -af volume=6dB output.mp4
# Reducir 3 dB
ffmpeg -i input.mp4 -af volume=-3dB output.mp4
Usa volumedetect primero para medir el pico y el volumen medio:
ffmpeg -i input.mp4 -af volumedetect -f null -
Para más comandos básicos de audio en FFmpeg, consulta la sección de audio en Comandos FFmpeg: Guía práctica.
Cuándo usar dynaudnorm
dynaudnorm ajusta la ganancia por fragmento (por defecto ~8 segundos). Es más rápido que loudnorm y bueno para hacer audible el habla en voz baja, pero no sigue ningún estándar:
ffmpeg -i input.mp4 -af dynaudnorm=f=200:g=5 output.mp4
f= longitud de fotograma en milisegundos (por defecto 500)g= tamaño del filtro gaussiano (por defecto 31)
Preguntas frecuentes
¿Cuál es la diferencia entre LUFS y LKFS?
Son la misma medición. LUFS (Loudness Units Full Scale) es el término de la EBU; LKFS (Loudness K-weighted Full Scale) es el término de la ITU. -14 LUFS = -14 LKFS.
¿Por qué mi audio normalizado suena más bajo que el original?
La normalización de sonoridad se basa en la sonoridad percibida, no en el nivel de pico. Una fuente con mucha compresión dinámica puede tener un pico alto pero baja sonoridad percibida. Después de la normalización, el pico puede ser menor aunque la sonoridad percibida coincida con el objetivo.
¿Debo normalizar antes o después de la compresión/codificación?
Antes de la codificación final. Si normalizas después de la compresión con pérdida, estás aplicando ganancia a audio ya degradado. Normaliza la fuente de mayor calidad que tengas, luego codifica.
¿Puedo normalizar el audio sin recodificar el video?
Sí. Copia el flujo de video y solo recodifica el audio:
ffmpeg -i input.mp4 -c:v copy -af loudnorm=I=-16:TP=-1.5:LRA=11 -c:a aac -b:a 192k output.mp4
¿Qué tasa de muestreo debo usar para la salida?
48 kHz es el estándar para video. Para archivos solo de música, usa la tasa de la fuente. El filtro loudnorm internamente sobremuestrea a 192 kHz, así que agregar -ar 48000 a la salida evita cambios de tasa inesperados.
¿loudnorm funciona con sonido envolvente (5.1/7.1)?
Sí. El filtro maneja audio multicanal, pero configura dual_mono=true si tu fuente es contenido mono en un contenedor estéreo, para que la medición considere la reproducción de un solo canal.
¿Cómo verifico el resultado?
Ejecuta loudnorm en modo medición sobre el archivo de salida:
ffmpeg -i output.mp4 -af loudnorm=print_format=json -f null -
Verifica que input_i coincida con tu objetivo. Una desviación de ±0.5 LU es normal.
Conclusión
Referencia rápida para las tareas de normalización más comunes:
| Tarea | Comando clave |
|---|---|
| Normalizar rápido a -16 LUFS | loudnorm=I=-16:TP=-1.5:LRA=11 |
| YouTube/Spotify (-14 LUFS) | loudnorm=I=-14:TP=-1.5:LRA=11 |
| Apple Podcasts (-16 LUFS) | loudnorm=I=-16:TP=-1:LRA=11 |
| Emisión (EBU R128) | loudnorm=I=-23:TP=-1:LRA=7 |
| Solo medir (sin salida) | loudnorm=print_format=json -f null - |
| Mantener video, normalizar audio | -c:v copy -af loudnorm=... -c:a aac |
| Normalizar por lotes | ffmpeg-normalize *.mp4 -of out/ -ext mp4 |
El filtro loudnorm maneja la mayoría de necesidades de normalización. Para flujos de trabajo por lotes, ffmpeg-normalize ahorra tiempo significativo. Y para ajustes simples de volumen sin necesidad de cumplir estándares, el filtro volume es suficiente.
VPS en la nube de grado empresarial con centros de datos globales
- 13 centros de datos (EE.UU., Europa, Asia, Oriente Medio)
- Desde $4/mes por 1GB RAM — pago por uso
- Prueba gratuita de 30 días
Artículos relacionados: