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-runverificada) - 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.
| Grupo | Verbos | Para qué sirven |
|---|---|---|
| Básicos | audio, strip-audio, mute, volume, audio-fade | Extraer MP3, eliminar audio, silenciar un rango, ajustar ganancia, fade in/out |
| Loudness | normalize, audio-normalize-peak, loudness-meter | loudnorm EBU R128, normalización por pico, medición LUFS |
| Dinámica | audio-compressor, limiter, audio-gate | Comprimir rango, prevenir clipping, gate bajo umbral |
| EQ y filtros | audio-eq, audio-bass-boost, audio-treble-boost, audio-bandpass, audio-highpass, audio-lowpass | EQ 3 bandas, boost de banda única, filtros pasa / corte |
| Tiempo / pitch / sync | audio-pitch, audio-speed, audio-reverse, audio-delay | Cambiar pitch sin velocidad, cambiar tempo, invertir, ajuste A/V |
| Ruido y silencio | audio-noise-reduce, detect-silence, trim-silence, silence-insert, censor | Denoise FFT, encontrar/cortar/insertar silencios, censurar con pitido |
Cinco cosas que saber antes de seguir:
- La mayoría de verbos usan
-c:v copypara preservar el video. Si la entrada es un archivo de video, el stream de video se copia sin re-encodificación. Soloaudio(extrae a MP3) yloudness-meter/detect-silence(sin archivo de salida) se desvían. normalizees loudnorm de una pasada conTP=-1.5yLRA=11fijos. Solo la loudness integrada objetivo (--target, default-16LUFS) está expuesta. Para medir-y-aplicar en dos pasadas, usaloudness-meterpara leer los valores y luego baja a FFmpeg crudo.volumeacepta multiplicadores y dB.0.5es la mitad,2.0es el doble,3dBy-5dBtambién funcionan. El parser esparseVolumeLevelenutils.js— cualquier otra cosa se rechaza antes de ejecutar FFmpeg. dB negativo (-5dBetc.) requiere--como separador de fin-de-opciones en el shell — ver la secciónvolumeabajo. Lo mismo aplica a semitonos negativos deaudio-pitch(-3) y milisegundos negativos deaudio-delay(-200).audio-delayes asimétrico. Valores positivos usanadelaypara empujar el audio más tarde. Valores negativos usanatrim+asetpts=PTS-STARTPTSpara adelantar el audio cortando el inicio — así que la salida es más corta que la entrada en exactamente esa cantidad.audio-equsaequalizer=f=1000:t=h:width=500:g=Npara 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 conequalizery 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).
- Fuente:
src/commands/audio.js - Flags:
-vn -c:a libmp3lame -q:a 2 - Salida:
<input-stem>-audio.mp3
$ 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.
- Fuente:
src/commands/strip-audio.js - Flags:
-an -c:v copy - Salida:
<input-stem>-noaudio.<ext>
$ 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.
- Fuente:
src/commands/mute.js - Filtro:
volume=enable='between(t,<s>,<e>)':volume=0
| Opción | Default | Notas |
|---|---|---|
-s, --start <segundos> | 0 | Inicio del rango de mute |
-e, --end <segundos> | requerido | Fin del rango de mute |
-o, --output <path> | <input-stem>-muted.<ext> | — |
$ 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:
parseVolumeLevelrechaza 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)
$ 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.
- Fuente:
src/commands/audio-fade.js - Filtro:
afade=t=in:st=0:d=<in>+afade=t=out:st=<dur-out>:d=<out>encadenados con,
| Opción | Default | Notas |
|---|---|---|
--in <segundos> | 0 | Duración del fade-in (omitir o 0 para sin fade-in) |
--out <segundos> | 0 | Duración del fade-out (requiere --duration) |
--duration <segundos> | requerido si --out > 0 | Duración total para que el fade-out empiece en el offset correcto |
$ 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:
--targetacepta-70a-5(LUFS), default-16
$ 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.
- Fuente:
src/commands/audio-normalize-peak.js - Filtro:
loudnorm=I=-24:TP=<peak>:LRA=7:linear=true - Default:
--peak 0(pico toca 0 dBFS — riesgo de picos inter-sample)
$ 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.
- Fuente:
src/commands/loudness-meter.js - Filtro:
-af ebur128 -f null - - Sin
--output, sin-y— solo análisis
$ 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.
- Fuente:
src/commands/audio-compressor.js - Filtro:
acompressor=threshold=<t>dB:ratio=<r>:attack=<a>:release=<r>
| Opción | Default | Notas |
|---|---|---|
--threshold <dB> | -20 | La compresión empieza por encima de este nivel |
--ratio <n> | 4 | 4 = 4:1, 2 = 2:1, etc. |
--attack <ms> | 20 | Qué tan rápido engancha la compresión |
--release <ms> | 250 | Qué tan rápido suelta la compresión |
$ 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 -1dB,--attack 5ms,--release 50ms - Salida:
<input-stem>-limited.<ext>
$ 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 -30dB,--attack 20ms,--release 250ms - Salida:
<input-stem>-gated.<ext>
$ 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):
textbass=g=<bass>, treble=g=<treble>, equalizer=f=1000:t=h:width=500:g=<mid>
| Opción | Default | Rango |
|---|---|---|
--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 |
$ 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.
- Fuente:
src/commands/audio-bass-boost.js - Defaults:
--gain 10dB,--freq 100Hz - Salida:
<input-stem>-bass-boost.<ext>
$ 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>.
- Fuente:
src/commands/audio-treble-boost.js - Defaults:
--gain 5dB,--freq 3000Hz - Salida:
<input-stem>-treble-boost.<ext>
$ 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 1000Hz,--width 200Hz - Salida:
<input-stem>-bandpass.<ext>
$ 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.
- Fuente:
src/commands/audio-highpass.js - Filtro:
highpass=f=<freq> - Default:
--freq 200Hz - Salida:
<input-stem>-highpass.<ext>
$ 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.
- Fuente:
src/commands/audio-lowpass.js - Filtro:
lowpass=f=<freq> - Default:
--freq 3000Hz - Salida:
<input-stem>-lowpass.<ext>
$ 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>dondefactor = 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)
$ 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.
- Fuente:
src/commands/audio-speed.js - Argumento:
<factor>(número positivo) - Salida:
<input-stem>-aspeed.<ext>
$ 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).
- Fuente:
src/commands/audio-reverse.js - Filtro:
areverse - Salida:
<input-stem>-audio-reversed.<ext>
$ 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-STARTPTS— corta audio del inicio, acortando la salida exactamente esa cantidad - Argumento:
<ms>— milisegundos enteros, positivos o negativos - Salida:
<input-stem>-synced.<ext>
$ 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).
- Fuente:
src/commands/audio-noise-reduce.js - Filtro:
afftdn=nr=<strength> - Default:
--strength 12dB - Salida:
<input-stem>-denoised.<ext>
$ 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.
- Fuente:
src/commands/detect-silence.js - Filtro:
-af silencedetect=noise=<t>dB:d=<dur> -f null -
| Opción | Default | Notas |
|---|---|---|
--threshold <dB> | -30 | Audio más bajo que esto cuenta como silencio |
--duration <seg> | 2 | Longitud mínima de gap a reportar |
$ 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:
textsilenceremove=start_periods=1: start_duration=0: start_threshold=<t>dB: stop_periods=-1: stop_duration=<d>: stop_threshold=<t>dB -
Defaults:
--threshold -30dB,--min-duration 0.5seg -
Salida:
<input-stem>-trimmed-silence.<ext>
$ 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>
$ 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ón | Default | Notas |
|---|---|---|
-s, --start <segundos> | 0 | Inicio del beep |
-e, --end <segundos> | requerido | Fin del beep |
--freq <Hz> | 1000 | Frecuencia del beep |
$ 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.
# 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:
# 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:
# 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:
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:
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:
- Corre
npx fqmpeg <verbo> --helppara cualquier verbo de arriba y verás la lista de opciones en vivo. - 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.