32blogby Studio Mitsu

fqmpeg Audio: 26 Verbos para Niveles, EQ y Dinámica

Veintiséis verbos de fqmpeg para audio: niveles, loudness, EQ, dinámica, pitch, sincronización y silencio — defaults verificados, dry-run y recetas.

by omitsu24 min read
Contenido

El cluster C9 de fqmpeg es el motor de audio: 26 verbos que tocan la pista de audio de cualquier archivo. Cinco hacen lo básico (extraer, eliminar, silenciar, volumen, fade). Tres se encargan de medición y normalización de loudness (normalize, audio-normalize-peak, loudness-meter). Tres son procesadores dinámicos (audio-compressor, limiter, audio-gate). Seis son EQ y filtros de frecuencia (audio-eq y cuatro filtros de banda única, más audio-bandpass). Cuatro son verbos de tiempo / pitch / sincronización (audio-pitch, audio-speed, audio-reverse, audio-delay). Cinco tratan ruido y silencio (audio-noise-reduce, detect-silence, trim-silence, silence-insert, censor).

Esta guía recorre cada verbo contra su fuente en src/commands/ de fqmpeg 3.0.3 — el filtro FFmpeg subyacente, los defaults, el nombre de archivo de salida, y las trampas que no se ven solo con --help (normalize es loudnorm EBU R128 de una pasada con TP/LRA fijos; audio-pitch usa rubberband así que la dependencia no es trivial en algunos builds; audio-delay con valor negativo no es delay sino un atrim que adelanta el audio cortando el inicio; censor es un pitido de audio — no hay mosaico de video aquí; silence-insert se construye con apad + adelay y solo inserta al inicio del segmento que sigue al punto de inserción, no como un splice limpio en mitad del archivo).

Qué obtienes con esta guía

  • Una matriz de decisión de los 26 verbos por tarea (básicos / loudness / dinámica / EQ / tiempo / silencio)
  • La invocación FFmpeg exacta que genera cada verbo (salida --dry-run verificada)
  • Defaults, rangos, unidades (dB vs multiplicador vs Hz vs semitonos) y nombres de salida para cada comando
  • Tres recetas end-to-end — masterización de podcast, limpieza de diálogo y preparación de cama musical

Los 26 Verbos de un Vistazo

El cluster se divide en seis grupos por tarea. Elige el grupo, luego el verbo.

GrupoVerbosPara qué sirven
Básicosaudio, strip-audio, mute, volume, audio-fadeExtraer MP3, eliminar audio, silenciar un rango, ajustar ganancia, fade in/out
Loudnessnormalize, audio-normalize-peak, loudness-meterloudnorm EBU R128, normalización por pico, medición LUFS
Dinámicaaudio-compressor, limiter, audio-gateComprimir rango, prevenir clipping, gate bajo umbral
EQ y filtrosaudio-eq, audio-bass-boost, audio-treble-boost, audio-bandpass, audio-highpass, audio-lowpassEQ 3 bandas, boost de banda única, filtros pasa / corte
Tiempo / pitch / syncaudio-pitch, audio-speed, audio-reverse, audio-delayCambiar pitch sin velocidad, cambiar tempo, invertir, ajuste A/V
Ruido y silencioaudio-noise-reduce, detect-silence, trim-silence, silence-insert, censorDenoise FFT, encontrar/cortar/insertar silencios, censurar con pitido

Cinco cosas que saber antes de seguir:

  1. La mayoría de verbos usan -c:v copy para preservar el video. Si la entrada es un archivo de video, el stream de video se copia sin re-encodificación. Solo audio (extrae a MP3) y loudness-meter / detect-silence (sin archivo de salida) se desvían.
  2. normalize es loudnorm de una pasada con TP=-1.5 y LRA=11 fijos. Solo la loudness integrada objetivo (--target, default -16 LUFS) está expuesta. Para medir-y-aplicar en dos pasadas, usa loudness-meter para leer los valores y luego baja a FFmpeg crudo.
  3. volume acepta multiplicadores y dB. 0.5 es la mitad, 2.0 es el doble, 3dB y -5dB también funcionan. El parser es parseVolumeLevel en utils.js — cualquier otra cosa se rechaza antes de ejecutar FFmpeg. dB negativo (-5dB etc.) requiere -- como separador de fin-de-opciones en el shell — ver la sección volume abajo. Lo mismo aplica a semitonos negativos de audio-pitch (-3) y milisegundos negativos de audio-delay (-200).
  4. audio-delay es asimétrico. Valores positivos usan adelay para empujar el audio más tarde. Valores negativos usan atrim + asetpts=PTS-STARTPTS para adelantar el audio cortando el inicio — así que la salida es más corta que la entrada en exactamente esa cantidad.
  5. audio-eq usa equalizer=f=1000:t=h:width=500:g=N para la banda media. Es una banda media hardcoded centrada en 1 kHz con semi-ancho de 500 Hz — bien para presencia vocal pero no es un verdadero EQ shelving de 3 bandas. Si necesitas control preciso de medios, baja a FFmpeg crudo con equalizer y elige tu propio centro.

Básicos

audio — Extraer audio como MP3

Elimina el stream de video y re-encoda audio a MP3 en calidad VBR 2 (aproximadamente 190 kbps).

bash
$ npx fqmpeg audio input.mp4 --dry-run

  ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 input-audio.mp3

La extensión de salida siempre es .mp3 sin importar el códec fuente — fqmpeg re-encoda. Si quieres una copia sin pérdida de una pista AAC, usa FFmpeg crudo con ffmpeg -i input.mp4 -vn -c:a copy input.m4a.

strip-audio — Eliminar la pista de audio

Quita el audio, copia el stream de video sin cambios. Rápido, sin re-encodificación.

bash
$ npx fqmpeg strip-audio input.mp4 --dry-run

  ffmpeg -i input.mp4 -an -c:v copy input-noaudio.mp4

Útil para preparar B-roll antes de stack o concat — pistas de audio diferentes entre clips causan desajustes a nivel de contenedor que strip-audio evita limpiamente.

mute — Silenciar un rango temporal

Silencia el audio entre dos marcas de tiempo manteniendo el resto a volumen completo. El stream de video se copia.

OpciónDefaultNotas
-s, --start <segundos>0Inicio del rango de mute
-e, --end <segundos>requeridoFin del rango de mute
-o, --output <path><input-stem>-muted.<ext>
bash
$ npx fqmpeg mute input.mp4 -s 10 -e 15 --dry-run

  ffmpeg -i input.mp4 -af volume=enable='between(t,10,15)':volume=0 -c:v copy input-muted.mp4

--end es requerido (error si falta). Los valores son solo segundos — no se parsea HH:MM:SS.

volume — Ajustar ganancia de audio

Multiplica amplitud o aplica ganancia en dB a todo el archivo.

  • Fuente: src/commands/volume.js
  • Filtro: volume=<nivel> donde <nivel> es multiplicador (0.5, 2.0) o dB (3dB, -5dB)
  • Validación: parseVolumeLevel rechaza cualquier cosa que no sea <número> o <número>dB
  • Salida: <input-stem>-vol<nivel-saneado>.<ext> (ej. input-vol2.mp4, input-vol-5dB.mp4)
bash
$ npx fqmpeg volume input.mp4 2.0 --dry-run

  ffmpeg -i input.mp4 -af volume=2.0 -c:v copy input-vol2.0.mp4

$ npx fqmpeg volume input.mp4 --dry-run -- -5dB

  ffmpeg -i input.mp4 -af volume=-5dB -c:v copy input-vol-5dB.mp4

Los valores negativos en dB empiezan con -, que commander.js (el parser CLI que usa fqmpeg) trata como una opción, así que un simple volume input.mp4 -5dB falla con unknown option '-5dB'. Pasa -- como separador de fin-de-opciones y coloca cada opción --* (como --dry-run) antes de --; el positional <level> después acepta el valor con guión. Multiplicadores por encima de ~3.0 (o dB por encima de ~+10dB) sobre audio ya fuerte causarán clipping — encadena con limiter o usa normalize cuando quieras headroom.

audio-fade — Fade in y/o out de audio

Aplica un afade=in al inicio, un afade=out cerca del final, o ambos. El stream de video se copia.

OpciónDefaultNotas
--in <segundos>0Duración del fade-in (omitir o 0 para sin fade-in)
--out <segundos>0Duración del fade-out (requiere --duration)
--duration <segundos>requerido si --out > 0Duración total para que el fade-out empiece en el offset correcto
bash
$ npx fqmpeg audio-fade input.mp4 --in 2 --out 3 --duration 60 --dry-run

  ffmpeg -i input.mp4 -af afade=t=in:st=0:d=2,afade=t=out:st=57:d=3 -c:v copy input-audiofade.mp4

El requisito de duración es estructural — afade=t=out de FFmpeg necesita un tiempo de inicio explícito, no "final menos X". Ejecuta npx fqmpeg duration input.mp4 primero si no conoces la longitud.

Medición y Normalización de Loudness

normalize — loudnorm EBU R128 de una pasada

Aplica el filtro loudnorm en modo de una pasada apuntando a una loudness integrada configurable (LUFS). El true peak y el rango de loudness están fijos por seguridad.

  • Fuente: src/commands/normalize.js
  • Filtro: loudnorm=I=<target>:TP=-1.5:LRA=11
  • Rango: --target acepta -70 a -5 (LUFS), default -16
bash
$ npx fqmpeg normalize input.mp4 --target -14 --dry-run

  ffmpeg -i input.mp4 -af loudnorm=I=-14:TP=-1.5:LRA=11 -c:v copy input-normalized.mp4

Objetivos comunes: -23 LUFS (EBU broadcast), -16 LUFS (podcast / streaming, default), -14 LUFS (Spotify / YouTube), -10 LUFS (referencia comercial alta). loudnorm de una pasada es aproximado — para precisión broadcast haz un flujo de dos pasadas.

audio-normalize-peak — Normalización por pico a objetivo dB

Usa loudnorm lineal (modo true-peak-only) para escalar el audio de modo que la muestra más alta aterrice en --peak dB. Más rápido que loudnorm porque no corre modelado perceptual.

bash
$ npx fqmpeg audio-normalize-peak input.mp4 --peak -1 --dry-run

  ffmpeg -i input.mp4 -af loudnorm=I=-24:TP=-1:LRA=7:linear=true -c:v copy input-peak-norm.mp4

Usa --peak -1 o --peak -3 para headroom seguro — picos 0 dBFS reales sobreviven lossless pero pueden clippear después de re-encode MP3/AAC por reconstrucción inter-sample.

loudness-meter — Medir loudness EBU R128

Verbo de solo lectura. Corre ebur128 e imprime loudness integrada, true peak y rango de loudness a stderr. No hay archivo de salida.

bash
$ npx fqmpeg loudness-meter input.mp4 --dry-run

  ffmpeg -i input.mp4 -af ebur128 -f null -

Lee el último bloque Summary: de stderr después de ejecutarlo de verdad — muestra I:, Threshold:, LRA:, LRA low:, LRA high: y True peak:. Filtra con 2>&1 | grep -E '(I|LRA|True peak):' para quedarte solo con los números.

Procesamiento Dinámico

audio-compressor — Compresión de rango dinámico

Reduce la diferencia entre partes silenciosas y fuertes usando acompressor.

OpciónDefaultNotas
--threshold <dB>-20La compresión empieza por encima de este nivel
--ratio <n>44 = 4:1, 2 = 2:1, etc.
--attack <ms>20Qué tan rápido engancha la compresión
--release <ms>250Qué tan rápido suelta la compresión
bash
$ npx fqmpeg audio-compressor input.mp4 --threshold -18 --ratio 3 --dry-run

  ffmpeg -i input.mp4 -af acompressor=threshold=-18dB:ratio=3:attack=20:release=250 -c:v copy input-compressed-audio.mp4

La salida es <input>-compressed-audio.<ext> — el sufijo difiere del verbo compress de video (<input>-compressed.<ext>) para evitar colisiones al encadenar ambos sobre el mismo archivo.

limiter — Limitador brick-wall (alimiter)

Previene que el audio supere un techo. Ataque y release más rápidos que el compresor; se usa como última etapa antes de la entrega.

  • Fuente: src/commands/limiter.js
  • Filtro: alimiter=limit=<l>dB:attack=<a>:release=<r>
  • Defaults: --limit -1 dB, --attack 5 ms, --release 50 ms
  • Salida: <input-stem>-limited.<ext>
bash
$ npx fqmpeg limiter input.mp4 --limit -1 --dry-run

  ffmpeg -i input.mp4 -af alimiter=limit=-1dB:attack=5:release=50 -c:v copy input-limited.mp4

-1 dB es el techo de entrega estándar para streaming (da margen para picos inter-sample). Para TV broadcast usa -2 dB; para DVD/Blu-ray puedes llegar a -0.3.

audio-gate — Noise gate

Silencia el audio que cae bajo un umbral — útil para limpiar diálogo con ruido constante de habitación.

  • Fuente: src/commands/audio-gate.js
  • Filtro: agate=threshold=<t>dB:attack=<a>:release=<r>
  • Defaults: --threshold -30 dB, --attack 20 ms, --release 250 ms
  • Salida: <input-stem>-gated.<ext>
bash
$ npx fqmpeg audio-gate input.mp4 --threshold -35 --dry-run

  ffmpeg -i input.mp4 -af agate=threshold=-35dB:attack=20:release=250 -c:v copy input-gated.mp4

Pon el umbral unos dB sobre tu piso de ruido (mide primero con loudness-meter o mira el waveform). Demasiado alto y cortarás diálogo bajo; demasiado bajo y el gate no ayuda.

EQ y Filtros de Frecuencia

audio-eq — Ecualizador de 3 bandas

Bajos / medios / agudos en un solo paso. Internamente encadena bass, equalizer (medios) y treble.

  • Fuente: src/commands/audio-eq.js

  • Ensamblado del filtro (solo bandas distintas de cero emiten filtro):

    text
    bass=g=<bass>,
    treble=g=<treble>,
    equalizer=f=1000:t=h:width=500:g=<mid>
    
OpciónDefaultRango
--bass <dB>0-20 a 20
--mid <dB>0-20 a 20 (centro 1 kHz, ancho 500 Hz hardcoded)
--treble <dB>0-20 a 20
bash
$ npx fqmpeg audio-eq input.mp4 --bass 3 --treble 2 --dry-run

  ffmpeg -i input.mp4 -af bass=g=3,treble=g=2 -c:v copy input-eq.mp4

Si los tres valores son cero el comando falla — al menos uno de --bass, --mid, --treble debe ser distinto de cero.

audio-bass-boost — Boost de banda única en graves

Envuelve bass=g=<gain>:f=<freq> para control preciso de frecuencia central.

bash
$ npx fqmpeg audio-bass-boost input.mp4 --gain 6 --freq 80 --dry-run

  ffmpeg -i input.mp4 -af bass=g=6:f=80 -c:v copy input-bass-boost.mp4

Frecuencias centrales en el rango 60-120 Hz golpean fundamentales de bombo / voz masculina; 200+ Hz empieza a colorear medios.

audio-treble-boost — Boost de banda única en agudos

Envuelve treble=g=<gain>:f=<freq>.

bash
$ npx fqmpeg audio-treble-boost input.mp4 --gain 4 --freq 5000 --dry-run

  ffmpeg -i input.mp4 -af treble=g=4:f=5000 -c:v copy input-treble-boost.mp4

3-5 kHz añade presencia vocal; 8-12 kHz añade "aire"; por encima de 16 kHz afecta principalmente la brillantez percibida en oídos jóvenes.

audio-bandpass — Filtro paso-banda

Mantiene una banda estrecha, atenúa todo lo de fuera.

  • Fuente: src/commands/audio-bandpass.js
  • Filtro: bandpass=f=<freq>:w=<width>
  • Defaults: --freq 1000 Hz, --width 200 Hz
  • Salida: <input-stem>-bandpass.<ext>
bash
$ npx fqmpeg audio-bandpass input.mp4 --freq 1500 --width 400 --dry-run

  ffmpeg -i input.mp4 -af bandpass=f=1500:w=400 -c:v copy input-bandpass.mp4

Úsalo para efectos de teléfono / walkie-talkie (banda 300-3000 Hz) o para aislar una frecuencia problemática antes de quitarla con notch.

audio-highpass — Paso-alto (quita graves)

Corta todo bajo el cutoff. Útil para eliminar rumble / HVAC / ruido de manipulación.

bash
$ npx fqmpeg audio-highpass input.mp4 --freq 80 --dry-run

  ffmpeg -i input.mp4 -af highpass=f=80 -c:v copy input-highpass.mp4

80 Hz es un default seguro que quita la mayoría de rumble sin adelgazar voces masculinas; 120 Hz es agresivo (corta voz masculina baja); 200 Hz ya es territorio "ancho de banda telefónico".

audio-lowpass — Paso-bajo (quita agudos)

Corta todo sobre el cutoff. Útil para suavizar material sibilante / con hiss.

bash
$ npx fqmpeg audio-lowpass input.mp4 --freq 8000 --dry-run

  ffmpeg -i input.mp4 -af lowpass=f=8000 -c:v copy input-lowpass.mp4

El default de 3000 Hz es dramático (sensación apagada / submarina). Para de-hiss suave en mics calientes prueba --freq 10000 o 12000.

Tiempo, Pitch y Sincronización

audio-pitch — Cambiar pitch sin cambiar velocidad

Usa la librería Rubber Band (debe estar compilada en tu FFmpeg).

  • Fuente: src/commands/audio-pitch.js
  • Filtro: rubberband=pitch=<factor> donde factor = 2^(semitonos/12)
  • Argumento: <semitonos> — posicional, acepta números positivos o negativos (ej. 2, -3, -1.5)
  • Salida: <input-stem>-pitch+<n>.<ext> o <input-stem>-pitch<n>.<ext> (el signo está en el nombre)
bash
$ npx fqmpeg audio-pitch input.mp4 2 --dry-run

  ffmpeg -i input.mp4 -af rubberband=pitch=1.122462 -c:v copy input-pitch+2.mp4

$ npx fqmpeg audio-pitch input.mp4 --dry-run -- -3

  ffmpeg -i input.mp4 -af rubberband=pitch=0.840896 -c:v copy input-pitch-3.mp4

Si obtienes No such filter: 'rubberband', tu FFmpeg fue compilado sin --enable-librubberband. Los builds estáticos de BtbN y gyan.dev lo incluyen; el default de Homebrew también; el paquete oficial de Debian también. Si no puedes reemplazar tu FFmpeg, usa asetrate=44100*1.122462,aresample=44100,atempo=1/1.122462 como alternativa para un shift de 2 semitonos — calidad menor pero solo filtros built-in.

audio-speed — Cambiar tempo sin cambiar pitch

Envuelve atempo=<factor>. El filtro nativo acepta 0.5 a 2.0 en una sola instancia — para cambios más fuertes FFmpeg soporta encadenado (atempo=2.0,atempo=2.0 para 4x), pero fqmpeg no encadena automáticamente. Mantente entre 0.5 y 2.0.

bash
$ npx fqmpeg audio-speed input.mp4 1.5 --dry-run

  ffmpeg -i input.mp4 -af atempo=1.5 -c:v copy input-aspeed.mp4

Nota: solo el audio cambia de velocidad — el timing del video queda igual porque -c:v copy mantiene los timestamps originales. Para cambiar ambos, usa el verbo speed de C4.

audio-reverse — Invertir solo audio

Reproduce el audio al revés manteniendo el video hacia adelante (crea un efecto de glitch llamativo).

bash
$ npx fqmpeg audio-reverse input.mp4 --dry-run

  ffmpeg -i input.mp4 -af areverse -c:v copy input-audio-reversed.mp4

areverse bufferiza todo el stream de audio en RAM — ojo con archivos de muchas horas. Para invertir audio + video, usa el verbo reverse de C4.

audio-delay — Offset de sincronización A/V (semántica asimétrica)

Retrasa o adelanta el audio respecto al video. Valores positivos retrasan; valores negativos adelantan.

  • Fuente: src/commands/audio-delay.js
  • Positivo (retraso): adelay=<ms>|<ms> — añade silencio al inicio del audio
  • Negativo (adelanto): atrim=start=<seg>,asetpts=PTS-STARTPTScorta audio del inicio, acortando la salida exactamente esa cantidad
  • Argumento: <ms> — milisegundos enteros, positivos o negativos
  • Salida: <input-stem>-synced.<ext>
bash
$ npx fqmpeg audio-delay input.mp4 200 --dry-run

  ffmpeg -i input.mp4 -af adelay=200|200 -c:v copy input-synced.mp4

$ npx fqmpeg audio-delay input.mp4 --dry-run -- -200

  ffmpeg -i input.mp4 -af atrim=start=0.2,asetpts=PTS-STARTPTS -c:v copy input-synced.mp4

La asimetría importa: si adelantas audio por 200 ms, los primeros 200 ms de audio desaparecen, no se desplazan. Esto está bien para arreglar latencia de captura donde el audio temprano es silencio de todas formas, pero es destructivo si el inicio contenía contenido.

Ruido y Silencio

audio-noise-reduce — Denoise basado en FFT

Envuelve afftdn (denoiser FFT). Funciona mejor con ruido estacionario (zumbido de ventilador, tráfico, hiss de cinta).

bash
$ npx fqmpeg audio-noise-reduce input.mp4 --strength 18 --dry-run

  ffmpeg -i input.mp4 -af afftdn=nr=18 -c:v copy input-denoised.mp4

--strength 12 es suave (reducción audible de ruido sin artefactos en voz); --strength 24 es agresivo (más limpio pero empieza a añadir artefactos "submarinos"). Prueba primero en una muestra de 5 segundos para encontrar el nivel adecuado.

detect-silence — Encontrar rangos silenciosos (solo análisis)

Verbo de solo lectura. Corre silencedetect e imprime líneas silence_start / silence_end / silence_duration a stderr. Sin archivo de salida.

OpciónDefaultNotas
--threshold <dB>-30Audio más bajo que esto cuenta como silencio
--duration <seg>2Longitud mínima de gap a reportar
bash
$ npx fqmpeg detect-silence input.mp4 --threshold -40 --duration 1 --dry-run

  ffmpeg -i input.mp4 -af silencedetect=noise=-40dB:d=1 -f null -

Filtra stderr con grep silence_ para extraer solo los timings. Útil para detección de escenas guionada antes de trocear entrevistas en segmentos.

trim-silence — Quitar secciones silenciosas

Usa silenceremove para cortar silencio sobre una duración mínima. Tanto silencio inicial como entre segmentos se eliminan.

  • Fuente: src/commands/trim-silence.js

  • Filtro:

    text
    silenceremove=start_periods=1:
    start_duration=0:
    start_threshold=<t>dB:
    stop_periods=-1:
    stop_duration=<d>:
    stop_threshold=<t>dB
    
  • Defaults: --threshold -30 dB, --min-duration 0.5 seg

  • Salida: <input-stem>-trimmed-silence.<ext>

bash
$ npx fqmpeg trim-silence input.mp4 --threshold -35 --min-duration 1 --dry-run

  ffmpeg -i input.mp4 -af silenceremove=start_periods=1:start_duration=0:start_threshold=-35dB:stop_periods=-1:stop_duration=1:stop_threshold=-35dB -c:v copy input-trimmed-silence.mp4

stop_periods=-1 significa "quitar todas las secciones silenciosas" (no solo la primera). El stream de video todavía se copia — el A/V se desincroniza, ya que el audio es más corto que el video después de la eliminación. Para un "corte de entrevista" donde quieres que el video siga, baja a FFmpeg crudo con filter_complex y reajusta el video junto. Alternativa con fqmpeg: usar detect-silence para sacar timestamps y luego cortar con trim de C4.

silence-insert — Insertar silencio en una posición

Añade silencio con apad + adelay.

  • Fuente: src/commands/silence-insert.js
  • Filtro: apad=pad_dur=<dur>:pad_len=0,adelay=<atMs>|<atMs>
  • Argumentos: <at> (offset en segundos) y <duration> (segundos de silencio)
  • Salida: <input-stem>-silence-ins.<ext>
bash
$ npx fqmpeg silence-insert input.mp4 10 3 --dry-run

  ffmpeg -i input.mp4 -af apad=pad_dur=3:pad_len=0,adelay=10000|10000 -c:v copy input-silence-ins.mp4

Cuidado: esto no es un "splice" limpio en el tiempo <at>. La forma en que se encadenan apad + adelay, todo el audio se desplaza <at> ms después de añadir el pad — así que el audio original suena empezando en <at>, con <duration> segundos de pad al final. Si necesitas un splice de punto medio verdadero (original 0…10 + silencio + original 10…fin), usa un grafo de filtros multi-input en FFmpeg crudo.

censor — Pitido sobre un rango (audio, no video)

Reemplaza el audio en un rango temporal con un beep de onda sinusoidal. Importante: esto es censor de audio, no un mosaico de video — para difuminar video usa blur o pixelate.

  • Fuente: src/commands/censor.js

  • Filtro: silenciar el audio original en el rango y mezclar una onda sinusoidal generada para el mismo rango:

    text
    [0:a]volume=enable='between(t,<s>,<e>)':volume=0[a0];
    [1:a]volume=enable='between(t,<s>,<e>)':volume=1:eval=frame[a1];
    [a0][a1]amix=inputs=2:duration=first[aout]
    
OpciónDefaultNotas
-s, --start <segundos>0Inicio del beep
-e, --end <segundos>requeridoFin del beep
--freq <Hz>1000Frecuencia del beep
bash
$ npx fqmpeg censor input.mp4 -s 10 -e 12 --dry-run

  ffmpeg -i input.mp4 -f lavfi -i sine=frequency=1000 -filter_complex [0:a]volume=enable='between(t,10,12)':volume=0[a0];[1:a]volume=enable='between(t,10,12)':volume=1:eval=frame[a1];[a0][a1]amix=inputs=2:duration=first[aout] -map 0:v? -map [aout] -c:v copy -shortest input-censored.mp4

La salida usa -map 0:v? (video opcional) así que funciona también con entradas solo de audio. -shortest asegura que el generador de sine no se extienda más allá de la duración fuente.

Recetas del mundo real

Tres pipelines de audio end-to-end que encadenan varios verbos.

1. Masterización de podcast (gate → compress → normalize → limit)

Cadena de entrega estándar para una entrevista grabada. El orden importa — gate primero para limpiar ruido de habitación, comprimir para nivelar, normalizar a loudness objetivo, luego limitar para evitar overshoot final.

bash
# 1. Gate ruido de habitación bajo -45 dB
npx fqmpeg audio-gate raw.wav --threshold -45 -o step1.wav

# 2. Comprimir dinámica (3:1, ataque suave)
npx fqmpeg audio-compressor step1.wav --threshold -18 --ratio 3 -o step2.wav

# 3. Normalizar al estándar de podcast (-16 LUFS)
npx fqmpeg normalize step2.wav --target -16 -o step3.wav

# 4. Limitador brick-wall en -1 dB
npx fqmpeg limiter step3.wav --limit -1 -o final.wav

Para producción de alto volumen, reemplaza los .wav intermedios con named pipes o muévete a una sola invocación ffmpeg -af gate,acompressor,loudnorm,alimiter. El --dry-run de cada paso de fqmpeg te da los bloques de construcción.

2. Limpieza de diálogo (highpass → denoise → atenuar agudos)

Para diálogo con rumble de micro, hiss de habitación y sibilancia áspera:

bash
# 1. Quitar rumble bajo 80 Hz
npx fqmpeg audio-highpass dialogue.wav --freq 80 -o step1.wav

# 2. Reducir hiss de banda ancha (ruido estacionario)
npx fqmpeg audio-noise-reduce step1.wav --strength 15 -o step2.wav

# 3. Inspeccionar loudness antes de la etapa final
npx fqmpeg loudness-meter step2.wav 2>&1 | grep -E '(I|LRA|True peak):'

# 4. Domar sibilancia áspera con un lowpass suave a 10 kHz
npx fqmpeg audio-lowpass step2.wav --freq 10000 -o final.wav

loudness-meter entre pasos es el equivalente en audio de crop-detect en el cluster de geometría — medir, decidir, luego actuar.

3. Sincronización de cama musical (corrección de delay + normalizar para preparar ducking)

Cuando la pista musical fue capturada por separado y necesita ir "debajo" de una voz:

bash
# 1. Arreglar drift de sincronización (música empieza 350 ms antes que la voz)
npx fqmpeg audio-delay music.wav 350 -o synced.wav

# 2. Normalizar música a un objetivo más bajo para que no compita con la voz (-22 LUFS)
npx fqmpeg normalize synced.wav --target -22 -o quiet-music.wav

# 3. Fade in / out limpio (colas de 3 s)
npx fqmpeg audio-fade quiet-music.wav --in 3 --out 3 --duration 120 -o bed.wav

# 4. Mezclar con la voz (cae a ffmpeg crudo o al verbo mix-audio de C11)
ffmpeg -i voice.wav -i bed.wav -filter_complex amix=inputs=2:duration=longest:weights=1.5\ 1 final.wav

La cadena se queda en fqmpeg hasta la mezcla final — en la etapa de mezcla o subes a FFmpeg crudo o usas el verbo mix-audio de C11 (cubierto en el deep-dive de audio-routing).

Preguntas frecuentes

¿En qué se diferencia normalize de volume?

volume es un multiplicador de ganancia fijo o un offset en dB — desplaza cada muestra la misma cantidad y no piensa en loudness. normalize corre el filtro loudnorm (EBU R128) y desplaza la ganancia para que la loudness integrada medida coincida con tu objetivo en LUFS. Para "que esto suene como el resto de la plataforma" quieres normalize; para "que esto sea exactamente 6 dB más fuerte" quieres volume.

¿Qué objetivo de loudness usar con normalize?

-23 LUFS para EBU broadcast TV (Europa). -24 LUFS para ATSC A/85 (broadcast EE.UU.). -16 LUFS para podcasts (la mayoría de hosts apuntan a esto — y es el default de fqmpeg). -14 LUFS para streaming musical (Spotify, YouTube, Apple Music normalizan los másters entrantes a este nivel). -10 LUFS para referencia comercial de "guerra de loudness" (no entregues esto realmente — pierdes detalle por la normalización de plataforma).

¿Por qué audio-pitch falla con "No such filter: rubberband"?

Tu FFmpeg fue compilado sin --enable-librubberband. Los builds estáticos de BtbN y gyan.dev lo incluyen. En macOS el ffmpeg de Homebrew incluye Rubber Band; en Linux el paquete oficial de Debian también. Si no puedes reemplazar tu FFmpeg, recurre a asetrate=44100*1.122462,aresample=44100,atempo=1/1.122462 para un shift de 2 semitonos — menor calidad pero usa solo filtros built-in.

¿Cuál es la diferencia entre audio-fade y el verbo fade de C4?

fade de C4 es solo video (cross-fade visual o dip-a-negro). audio-fade solo toca la pista de audio y copia el stream de video. Para ambos a la vez, ejecuta en secuencia: npx fqmpeg fade ... y luego npx fqmpeg audio-fade ... sobre el resultado.

¿Cómo capturo la salida de loudness-meter y detect-silence?

Ambos verbos imprimen a stderr y no escriben archivo. Redirige con 2> para capturar, o pipea con 2>&1 para filtrar:

bash
npx fqmpeg loudness-meter input.mp4 2>&1 | grep -E '(I|LRA|True peak):'
npx fqmpeg detect-silence input.mp4 --threshold -40 2>&1 | grep silence_

En CI o script, parsea las líneas de stderr para los valores que necesites.

¿trim-silence mantiene audio y video sincronizados?

No. El stream de video se copia sin cambios mientras el audio se acorta a medida que se eliminan secciones silenciosas — así que la salida se desincroniza. Para un "corte de entrevista" donde el video debe seguir los cortes de audio, necesitas un filter_complex de una pasada con filtros select y aselect emparejados. fqmpeg no expone esto directamente; cae a FFmpeg crudo o pre-edita con el verbo trim de C4 en los timestamps que reporta detect-silence.

¿censor es un mosaico de video?

No. censor reemplaza audio con un beep sinusoidal. Para censurar visualmente usa los verbos blur o pixelate de C6 sobre una región recortada, o compón con drawbox (C8) para un rectángulo opaco.

¿Cómo encadeno varios filtros de audio sin archivos intermedios?

Para dos o tres pasos, el enfoque de archivos intermedios de fqmpeg está bien — el disco es rápido y los SSD hacen el coste de I/O despreciable. Para cadenas más largas donde quieres una sola invocación FFmpeg, corre cada verbo con --dry-run, copia el valor de -af, y combínalos con comas:

bash
ffmpeg -i input.wav -af "highpass=f=80,afftdn=nr=15,loudnorm=I=-16:TP=-1.5:LRA=11,alimiter=limit=-1dB:attack=5:release=50" -c:v copy out.wav

Esto es exactamente lo que los comandos individuales de fqmpeg hacen internamente — combinarlos solo elimina los round-trips a disco.

¿Qué códec de audio usa fqmpeg para la salida?

Para la mayoría de verbos, el códec de audio es el que el contenedor de salida negocie por defecto en re-encodificación (típicamente AAC para MP4, Vorbis/Opus para WebM, MP3 para .mp3). fqmpeg no establece -c:a explícitamente, así que FFmpeg elige el códec que case con la extensión. La excepción es el verbo audio que siempre sale como MP3 vía libmp3lame -q:a 2.

Cerrando

El cluster C9 de fqmpeg cubre la caja de herramientas diaria del ingeniero de audio: 26 verbos que puedes encadenar para construir un máster de podcast, limpiar diálogo o sincronizar una cama musical sin escribir un solo grafo de filtros. Los puntos no obvios — la semántica asimétrica de audio-delay, la dependencia Rubber Band de audio-pitch, la banda media hardcoded de audio-eq, el drift A/V de trim-silence, el comportamiento de cola desplazada de silence-insert — están documentados arriba para que no los pises en producción.

Dos próximos pasos:

  1. Corre npx fqmpeg <verbo> --help para cualquier verbo de arriba y verás la lista de opciones en vivo.
  2. Para efectos creativos (reverb, echo, chorus, phaser, etc.), mira el deep-dive C10 (efectos creativos de audio). Para routing, canales y visualización (waveforms, espectrogramas), mira C11 (audio routing y visualización).

La próxima vez que alargues la mano hacia un filtro -af, revisa primero la lista de verbos.