32blogby Studio Mitsu

Normalización de audio con FFmpeg: Guía completa de loudnorm

Aprende a normalizar audio con el filtro loudnorm de FFmpeg. Cubre normalización EBU R128 en uno y dos pasos, niveles LUFS por plataforma, procesamiento por lotes con ffmpeg-normalize y más.

by omitsu10 min read
FFmpegCLIaudionormalizationencodingcommands

This article contains affiliate links.

Contenido

¿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:

bash
ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11 output.mp4

Qué hace cada parámetro:

ParámetroSignificadoRangoPor defecto
ISonoridad integrada objetivo (LUFS)-70.0 a -5.0-24.0
TPPico verdadero máximo (dBTP)-9.0 a 0.0-2.0
LRARango de sonoridad objetivo (LU)1.0 a 50.07.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:

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

json
{
  "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

bash
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

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

bash
#!/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:

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

PlataformaLUFS objetivoPico verdaderoNotas
YouTube-14 LUFS-1.5 dBTPAplica normalización en reproducción
Spotify-14 LUFS-1 dBTPUsa normalización estilo ReplayGain
Apple Music-16 LUFS-1 dBTPFunción Sound Check
Apple Podcasts-16 LUFS-1 dBTPMismo estándar que Apple Music
Amazon Music-14 LUFS-2 dBTPSolo baja volumen, nunca sube
TikTok~-14 LUFS-1 dBTPSin especificación oficial; consenso del sector
Instagram Reels~-14 LUFS-1 dBTPMeta gestiona vía xHE-AAC
EBU R128 (emisión)-23 LUFS-1 dBTPEstá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):

bash
ffmpeg -i input.mp4 -af loudnorm=I=-14:TP=-1.5:LRA=11 output.mp4

Apple Music / Podcasts (-16 LUFS):

bash
ffmpeg -i input.mp4 -af loudnorm=I=-16:TP=-1:LRA=11 output.mp4

Emisión (EBU R128, -23 LUFS):

bash
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

bash
pip install ffmpeg-normalize

Uso básico

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

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

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

FiltroMétodoIdeal paraCompensación
loudnormSonoridad perceptual EBU R128Streaming, emisión, podcastsMás preciso; sobremuestrea a 192 kHz
volumeMultiplicador de ganancia fijoAjustes simples ("subir volumen")Sin conciencia de sonoridad; puede recortar
dynaudnormGanancia dinámica por fragmentoConversaciones, entrevistas~4x más rápido que loudnorm; sin cumplimiento de estándares
compandCompresión de rango dinámicoEfectos de compresión fuertesPuede 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:

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

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

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

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

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

TareaComando clave
Normalizar rápido a -16 LUFSloudnorm=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 lotesffmpeg-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.

Kamatera

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: