32blogby Studio Mitsu

fqmpeg Routing de Audio, Canales y Visualización: 14 Verbos Explicados

14 verbos de fqmpeg para layout de canales, ensamblado multi-pista, sample rate / bit depth y visualización — defaults verificados contra el código fuente, salida de --dry-run y qué invoca cada comando bajo el capó.

by omitsu26 min read
Contenido

El cluster C11 de fqmpeg es la "tubería e instrumentos" del kit de audio — catorce verbos que mueven audio (layout de canales, ensamblado multi-pista), reshapean su formato de datos (sample rate, bit depth) o convierten audio en imágenes (visualización). Comparado con C9 (niveles / EQ / dinámica) y C10 (efectos creativos), C11 cambia el contenedor y el routing del audio, raramente su contenido sónico.

Esta guía recorre cada verbo contra su código fuente en src/commands/ de fqmpeg 3.0.3 — el filtro o flag FFmpeg subyacente, los defaults, el nombre del archivo de salida y las trampas que no se ven solo desde --help (stereo --mode 5.1 y surround son idénticos, pan-audio es atenuación lineal no equal-power, bit-depth solo funciona en contenedores compatibles con PCM, audio-visualize --mode waves pinta en un verde fijo).

Lo que sacarás de esta guía

  • Una matriz de decisión de los 14 verbos por tarea (layout / multi-pista / formato / visualización)
  • La invocación FFmpeg exacta que genera cada verbo (salida --dry-run verificada)
  • Defaults, unidades, nombres de archivo de salida — y qué está hardcodeado en la superficie simplificada
  • Tres recetas — ensamblado de podcast con dos micrófonos, subida multilingüe de clase, subida de audio YouTube con visual de forma de onda

Los 14 Verbos de un Vistazo

El cluster se divide en cuatro grupos de tareas. Elige el grupo, luego el verbo.

GrupoVerbosQué hacen
Layout de canalesstereo, surround, extract-audio-channel, pan-audioCambia número de canales, aísla un lado, posiciona en el campo estéreo
Ensamblado multi-pistamulti-audio, mix-audio, replace-audio, concat-audioAñade pistas, mezcla BGM, reemplaza audio, une clips
Formato y calidadsample-rate, bit-depthResamplea a un Hz objetivo, cambia bit depth PCM
Visualizaciónaudio-visualize, oscilloscope, waveform, spectrumRenderiza video animado, overlay vectorscope, genera PNG estático de waveform / espectrograma

Cinco cosas a saber antes de seguir leyendo:

  1. stereo y surround son wrappers finos sobre -ac. Configuran la cuenta de canales (1, 2, 6) y dependen de la matriz por defecto de downmix/upmix de FFmpeg. No hay routing especial de LFE, ni mixing Dolby-aware — surround es literalmente stereo --mode 5.1. Si necesitas un upmix estéreo→5.1 creíble, usa el filtro surround de FFmpeg directamente (cosa distinta — es un upmixer que sigue el envolvente).
  2. pan-audio es un pan lineal, no equal-power. En --position 0 (centro), ambos canales están a ganancia unidad, así que la amplitud sumada a mono es +6 dB más fuerte que en los extremos. Si haces crossfade entre diálogo paneado al centro y una fuente paneada fuerte, espera un pico de volumen en el punto medio.
  3. bit-depth solo funciona en contenedores compatibles con PCM. Fuerza pcm_s16le / pcm_s24le / pcm_s32le como codec de audio. Para MP4 o MKV con AAC, este comando no aplica — típicamente lo usas en archivos WAV. La extensión de salida se preserva desde la entrada, así que dale un .wav.
  4. audio-visualize y los visualizadores estáticos vienen con colores / layouts fijos. audio-visualize --mode waves pinta en 0x00FF00 (verde terminal); --mode spectrum es color=intensity. El waveform estático también es 0x00FF00 por defecto (pero expone --color). El spectrum estático expone 14 esquemas de color vía --color. El overlay oscilloscope es un avectorscope fijo de tamaño 320×320 colocado al 70 % de la pantalla.
  5. multi-audio recomienda .mkv porque MP4 multi-audio es inestable. MP4 técnicamente soporta múltiples streams de audio, pero muchos reproductores (Safari, navegadores móviles) solo reproducen el primero. MKV es universalmente honesto sobre el cambio de pistas.

Layout de Canales y Routing

stereo — Convertir canales de audio (mono ↔ estéreo ↔ 5.1)

Un wrapper fino sobre el flag -ac de FFmpeg. Configura la cuenta de canales a 1, 2 o 6; la matriz real de up/downmix viene de los defaults de FFmpeg.

Argumento / OpciónPor defectoPermitidoNotas
<input>requeridoVideo/audio de entrada
--mode <mode>stereomono, stereo, 5.1Mapea a -ac 1, -ac 2, -ac 6
-o, --output <path><input-stem>-<mode>.<ext>Sobrescribir salida
bash
$ npx fqmpeg stereo input.mp4 --mode mono --dry-run

  ffmpeg -i input.mp4 -ac 1 -c:v copy input-mono.mp4
bash
$ npx fqmpeg stereo input.mp4 --mode 5.1 --dry-run

  ffmpeg -i input.mp4 -ac 6 -c:v copy input-5.1.mp4

Qué está hardcodeado y por qué: la matriz de up/downmix no la hardcodea fqmpeg — es la matriz pan-law incorporada de FFmpeg. Para estéreo → mono, FFmpeg suma L+R con ganancia igual (−3 dB cada uno). Para estéreo → 5.1, duplica L en FL+BL, R en FR+BR, suma en FC y sintetiza LFE desde el FC pasa-bajos — un default razonable pero no un upmix creativo. Para un widening estéreo-a-5.1 creíble (extracción de ambiente con seguimiento de envolvente), baja al filtro surround de FFmpeg directamente (el filtro, no este verbo).

Cuando te quedas corto: para lógica de upmix no-default, escribe la matriz pan explícitamente con el filtro pan:

bash
ffmpeg -i stereo.wav -af "pan=5.1|FL=c0|FR=c1|FC=0.5*c0+0.5*c1|LFE=0.1*c0+0.1*c1|BL=c0|BR=c1" surround.wav

surround — Upmix de estéreo a sonido envolvente 5.1

Un alias por descubribilidad. Funcionalmente idéntico a stereo --mode 5.1: ambos pasan -ac 6 y dependen de la matriz upmix por defecto de FFmpeg.

Argumento / OpciónPor defectoNotas
<input>requeridoVideo/audio de entrada
-o, --output <path><input-stem>-surround.<ext>Sobrescribir salida
bash
$ npx fqmpeg surround input.mp4 --dry-run

  ffmpeg -i input.mp4 -ac 6 -c:v copy input-surround.mp4

Por qué dos comandos para lo mismo: descubribilidad. Los usuarios que buscan "surround" en fqmpeg --help encuentran este verbo directamente. Los que piensan en términos de layout de canales acuden a stereo --mode 5.1. Ambos producen la misma salida.

extract-audio-channel — Extraer un solo canal de audio

Saca el canal izquierdo o derecho de una fuente estéreo y lo emite como mono. Útil cuando se grabó un mic en un lado (rigs de entrevista, grabadoras de campo con dos micrófonos).

ArgumentoRequeridoPermitidoNotas
<input>Video/audio de entrada
<channel>left, rightQué lado conservar
-o, --output <path>noSobrescribir salida
bash
$ npx fqmpeg extract-audio-channel interview.wav left --dry-run

  ffmpeg -i interview.wav -af pan=mono|c0=FL -c:v copy interview-left.wav

La salida es mono (pan=mono|...), no estéreo con el otro lado en silencio — extrayendo izquierda y derecha por separado te da dos archivos mono de la misma duración.

pan-audio — Panear audio izquierda / derecha

Reposiciona la fuente dentro del campo estéreo. -1.0 = totalmente izquierda, 1.0 = totalmente derecha, 0 = centro.

  • Fuente: src/commands/pan-audio.js
  • Filtro: pan=stereo|c0=<L>*c0+0*c1|c1=0*c0+<R>*c1 donde L = min(1, 1-p) y R = min(1, 1+p)
  • Salida: <input-stem>-panned.<ext>
Argumento / OpciónRequeridoRangoNotas
<input>Video/audio de entrada
<position>-1.0 a 1.00 = centro, -1 = full izq, 1 = full der
-o, --output <path>noSobrescribir salida
bash
$ npx fqmpeg pan-audio input.mp4 0.5 --dry-run

  ffmpeg -i input.mp4 -af pan=stereo|c0=0.50*c0+0*c1|c1=0*c0+1.00*c1 -c:v copy input-panned.mp4

Ley de pan: atenuación lineal, recortada a la unidad. En position 0, ambos canales están a 1.0 — la suma mono es +6 dB más fuerte que en los extremos (position ±1, un lado a 1.0 y otro a 0). Esto no es pan equal-power, que atenuaría cada canal en 3 dB en el centro para mantener la suma mono constante. Si haces crossfade entre un diálogo paneado al centro y una fuente paneada fuerte, oirás un pico al pasar por el medio.

Cuando necesites equal-power: escribe la matriz pan tú mismo con ganancias sqrt:

bash
# Pan equal-power en posición 0.5 (ligero derecha): L = sqrt((1-p)/2), R = sqrt((1+p)/2)
ffmpeg -i in.wav -af "pan=stereo|c0=0.500*c0|c1=0.866*c1" out.wav

Ensamblado Multi-Pista

multi-audio — Añadir múltiples pistas de audio a un video

Adjunta uno o más archivos de audio como streams adicionales en la salida (junto a las pistas existentes). Útil para exports multilingües — los espectadores cambian audio en el reproductor. La salida es .mkv por defecto porque la reproducción multi-audio en MP4 no es confiable entre reproductores.

  • Fuente: src/commands/multi-audio.js
  • Flags: -map 0:v -map 0:a? -map 1:a -map 2:a ... -c copy
  • Salida: <video-stem>-multi-audio.mkv (extensión .mkv forzada)
Argumento / OpciónRequeridoNotas
<video>Archivo de video de entrada
<audios...>sí (≥1)Archivos de audio adicionales
-o, --output <path>noSobrescribir salida (.mkv recomendado)
bash
$ npx fqmpeg multi-audio video.mp4 jp.aac es.aac --dry-run

  ffmpeg -i video.mp4 -i jp.aac -i es.aac -map 0:v -map 0:a? -map 1:a -map 2:a -c copy video-multi-audio.mkv

-c copy en todo: sin re-encoding de video ni audio. Todas las entradas deben estar ya en un formato que el contenedor de salida (.mkv por defecto) acepte. El -map 0:a? usa el flag opcional (?), así que si el video fuente no tiene audio, el comando sigue funcionando.

La elección de .mkv: Matroska soporta streams de audio ilimitados limpiamente, y los reproductores (VLC, mpv, navegadores modernos vía <video> + track switching) lo manejan. MP4 nominalmente soporta multi-audio pero iOS Safari y algunos navegadores Android ignoran las pistas no-primarias.

mix-audio — Mezclar una pista de audio secundaria (BGM, narración)

Fusiona un segundo archivo de audio junto al original. El volumen por defecto del mix-in es 30 % — lo suficientemente bajo para funcionar como música de fondo sin tapar el diálogo.

  • Fuente: src/commands/mix-audio.js
  • Filtro: [1:a]volume=<v>[bgm];[0:a][bgm]amix=inputs=2:duration=first
  • Salida: <input-stem>-mixed.<ext>
Argumento / OpciónPor defectoRangoNotas
<input>requeridoVideo de entrada
<audio>requeridoAudio para mezclar
--volume <level>0.30.0 a 1.0Volumen del audio mezclado
--shortestoffflagTerminar la salida cuando termine el stream más corto
-o, --output <path><input-stem>-mixed.<ext>Sobrescribir salida
bash
$ npx fqmpeg mix-audio video.mp4 bgm.mp3 --dry-run

  ffmpeg -i video.mp4 -i bgm.mp3 -filter_complex [1:a]volume=0.3[bgm];[0:a][bgm]amix=inputs=2:duration=first -map 0:v -c:v copy video-mixed.mp4

duration=first: la salida termina cuando termina el audio del primero (original). Si tu BGM es más largo que el video, se trunca. Si es más corto, se detiene a mitad y el resto del video continúa solo con el audio original. Usa --shortest para también recortar a la longitud del BGM si quieres un loop ajustado.

La peculiaridad de normalización de amix: el filtro amix de FFmpeg divide la suma por el número de entradas por defecto (para prevenir clipping). Con 2 entradas, cada una se atenúa al 50 % antes de sumar. El --volume 0.3 de fqmpeg se aplica al BGM antes de amix, así que el nivel efectivo del BGM en la salida es aproximadamente 0.3 / 2 = 0.15 (−16 dB). Si el BGM se siente demasiado bajo, prueba --volume 0.6 en lugar de esperar que 0.3 signifique −10 dB.

replace-audio — Reemplazar la pista de audio completamente

Descarta el audio original, lo sustituye con un nuevo archivo. Stream-copy: sin re-encoding, así que el nuevo audio debe estar ya en un formato que el contenedor de salida acepte.

Argumento / OpciónPor defectoNotas
<input>requeridoVideo de entrada
<audio>requeridoNuevo archivo de audio
--shortestoffTerminar al final del más corto (video, nuevo audio)
-o, --output <path><input-stem>-newaudio.<ext>Sobrescribir salida
bash
$ npx fqmpeg replace-audio video.mp4 voiceover.aac --dry-run

  ffmpeg -i video.mp4 -i voiceover.aac -map 0:v -map 1:a -c:v copy video-newaudio.mp4

El nuevo audio se stream-copia (no hay flag -c:a que sobrescriba esto, así que FFmpeg usa copy por defecto cuando ningún filter graph toca el stream). Si tu nuevo audio es .wav y el contenedor es .mp4, FFmpeg puede rechazarlo (PCM en MP4 no es estándar). Convierte el audio a AAC primero, o cambia la extensión de salida.

concat-audio — Concatenar múltiples archivos de audio

Une dos o más archivos de audio uno tras otro. Usa el demuxer concat de FFmpeg (enfoque basado en listfile), que requiere que todas las entradas compartan el mismo codec, sample rate y layout de canales (de lo contrario el stream-copy falla). fqmpeg auto-genera el listfile en el directorio de la primera entrada, ejecuta el concat y limpia al salir.

Argumento / OpciónRequeridoNotas
<inputs...>sí (≥2)Dos o más archivos de audio en orden
-o, --output <path>noSobrescribir salida
bash
$ npx fqmpeg concat-audio part1.mp3 part2.mp3 part3.mp3 --dry-run

  # File list (auto-generated):
  # file '/abs/path/part1.mp3'
  # file '/abs/path/part2.mp3'
  # file '/abs/path/part3.mp3'

  ffmpeg -f concat -safe 0 -i filelist.txt -c copy part1-joined.mp3

Requisitos del demuxer concat: todas las entradas deben tener idéntico codec + sample rate + layout de canales. Si part1 es MP3 estéreo 48 kHz y part2 es MP3 mono 44.1 kHz, el concat stream-copy falla. O re-encodea las partes a un formato común primero, o usa el filtro concat (no el demuxer) que re-encodea:

bash
ffmpeg -i p1.mp3 -i p2.mp3 -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1[out]" -map "[out]" joined.mp3

Rutas absolutas en el listfile: fqmpeg resuelve cada entrada a ruta absoluta antes de escribir el listfile, así que el concat funciona sin importar dónde esté el listfile. El listfile se crea en el directorio de la primera entrada con un nombre con timestamp como .fqmpeg-concat-audio-1730000000000.txt y se borra al salir.

Formato y Calidad

sample-rate — Cambiar sample rate de audio

Resamplea a un rate objetivo vía -ar. El resampler por defecto de FFmpeg (soxr en builds modernas, aresample si no) maneja tanto up- como down-sampling.

Argumento / OpciónRequeridoNotas
<input>Video/audio de entrada
<rate>sí (entero positivo en Hz)Comunes: 44100 (CD), 48000 (video/broadcast), 96000 (masterización)
-o, --output <path>noSobrescribir salida
bash
$ npx fqmpeg sample-rate input.wav 48000 --dry-run

  ffmpeg -i input.wav -ar 48000 -c:v copy input-48000hz.wav

Por qué no es un enum: la descripción sugiere 44100, 48000, 96000, pero el validador solo requiere un entero positivo. Rates nicho (22050 para audio retro de teléfono, 192000 para masters hi-res) también funcionan. Cualquier cosa que el swresample de FFmpeg acepte.

El re-encoding es obligatorio. Stream-copy no puede cambiar sample rate. fqmpeg no pasa flag -c:a, así que FFmpeg elige el codec por defecto del contenedor de salida (AAC para MP4, PCM para WAV, etc.) y re-encodea. Para forzar un codec específico, baja a raw FFmpeg.

bit-depth — Cambiar bit depth de audio (PCM)

Fuerza el codec de audio a PCM en 16, 24 o 32 bits. Prácticamente esto significa que la salida debe ser un contenedor que soporte PCM (WAV, MKV, AIFF) — no MP4 con AAC.

ArgumentoRequeridoPermitidoNotas
<input>Video/audio de entrada (típicamente WAV)
<bits>16, 24, 32Bit depth objetivo
-o, --output <path>noSobrescribir salida
bash
$ npx fqmpeg bit-depth master.wav 24 --dry-run

  ffmpeg -i master.wav -c:a pcm_s24le -c:v copy master-24bit.wav

Compatibilidad de contenedor: .wav acepta los tres bit depths. .mkv también los acepta (PCM en Matroska es válido). .mp4 fallarápcm_s24le no es un codec válido para ISO BMFF (MP4). Si le das un .mp4, cambia la extensión de salida a .mkv o .wav vía -o.

24-bit interno: pcm_s24le almacena muestras de 24 bits en contenedores de 32 bits (little-endian, con 8 bits de padding). El tamaño del archivo escala correspondientemente — los archivos 24-bit son 1.5× el tamaño de 16-bit, no 2× (y los 32-bit son exactamente 2×).

Bit depth ≠ resolución de audio. Un archivo 24-bit grabado desde una fuente 16-bit no contiene más detalle — los 8 bits extra son ceros. Útil solo cuando la fuente realmente tiene mayor rango dinámico (grabación de campo multi-mic, masters de masterización).

Visualización

audio-visualize — Video animado de visualización de audio

Renderiza audio como un stream de video con uno de tres visualizadores en vivo: forma de onda con scroll (waves), espectrograma con scroll (spectrum) o histograma (histogram). La salida es .mp4 (H.264 + yuv420p) sin importar la extensión de entrada.

  • Fuente: src/commands/audio-visualize.js
  • Filtro (waves): showwaves=s=<W>x<H>:mode=cline:rate=30:colors=0x00FF00
  • Filtro (spectrum): showspectrum=s=<W>x<H>:mode=combined:color=intensity:slide=scroll
  • Filtro (histogram): ahistogram=s=<W>x<H>:rheight=0.5
  • Salida: <input-stem>-visualize.mp4 (.mp4 forzado)
Argumento / OpciónPor defectoPermitidoNotas
<input>requeridoAudio de entrada (también funciona video — solo se usa el stream de audio)
--mode <mode>waveswaves, spectrum, histogramEstilo de visualización
--size <WxH>1920x1080string de resoluciónTamaño del video de salida
-o, --output <path><input-stem>-visualize.mp4Sobrescribir salida
bash
$ npx fqmpeg audio-visualize song.mp3 --dry-run

  ffmpeg -i song.mp3 -filter_complex showwaves=s=1920x1080:mode=cline:rate=30:colors=0x00FF00 -c:v libx264 -pix_fmt yuv420p song-visualize.mp4
bash
$ npx fqmpeg audio-visualize song.mp3 --mode spectrum --dry-run

  ffmpeg -i song.mp3 -filter_complex showspectrum=s=1920x1080:mode=combined:color=intensity:slide=scroll -c:v libx264 -pix_fmt yuv420p song-visualize.mp4

Qué está hardcodeado:

  • waves: color 0x00FF00 (verde terminal), modo de dibujo cline (línea centrada, scroll), tasa de refresco 30 fps
  • spectrum: modo combined (una banda por par estéreo), esquema de color intensity, modo de scroll slide=scroll
  • histogram: rheight=0.5 (altura relativa de barra)
  • Los tres: video codec libx264 + yuv420p para reproducción universal

La elección de 0x00FF00 para waves coincide con el color de marca de 32blog, pero más importante, se lee bien contra fondo negro (que es lo que showwaves provee por defecto). Si quieres otro color, baja a raw FFmpeg:

bash
ffmpeg -i song.mp3 -filter_complex "showwaves=s=1920x1080:mode=cline:rate=30:colors=0xFF6600" \
  -c:v libx264 -pix_fmt yuv420p song-orange.mp4

Cuando te quedas corto: para visualizadores estilizados (barras 3D, ecualizador estilo Spotify con peak hold, sistemas de partículas), FFmpeg solo no alcanza. Mira Specterr o butterchurn (MilkDrop en el navegador) para video musical. Los visualizadores de fqmpeg son funcionales pero sencillos.

oscilloscope — Overlay de osciloscopio sobre video existente

Superpone un avectorscope (display circular de correlación de fase) sobre un video existente. Útil para videos musicales y demos de música electrónica donde ver la imagen estéreo es parte de la estética.

  • Fuente: src/commands/oscilloscope.js
  • Filtro: avectorscope=s=320x320:zoom=1.5:draw=line,format=yuva420p[osc];[0:v][osc]overlay=W*0.7:H*0.7
  • Salida: <input-stem>-oscilloscope.<ext>
Argumento / OpciónPor defectoNotas
<input>requeridoVideo de entrada con audio
-o, --output <path><input-stem>-oscilloscope.<ext>Sobrescribir salida
bash
$ npx fqmpeg oscilloscope musicvideo.mp4 --dry-run

  ffmpeg -i musicvideo.mp4 -filter_complex avectorscope=s=320x320:zoom=1.5:draw=line,format=yuva420p[osc];[0:v][osc]overlay=W*0.7:H*0.7 -c:a copy musicvideo-oscilloscope.mp4

avectorscope lee correlación estéreo. El patrón de puntos muestra cómo se relacionan los canales izquierdo y derecho momento a momento: una línea vertical = mono (perfectamente correlacionado), una línea horizontal = fuera de fase (la suma mono cancela), una nube circular = estéreo amplio. Para diálogo dual-mono, verás una sola línea vertical. Para un pad sintetizador amplio, verás una elipse ruidosa.

El audio se preserva (-c:a copy), el video se re-encodea por el filter graph.

Cuando te quedas corto: el filtro avectorscope subyacente tiene muchos más parámetros (zoom, m=peak/mode=binary, rc/gc/bc para color, t=draw/line/dot). Para personalizar más allá de lo que fqmpeg expone, copia el filtro de --dry-run y edita:

bash
# Colorea la traza, baja zoom, dibujo de puntos
ffmpeg -i input.mp4 -filter_complex "avectorscope=s=480x480:zoom=1.0:draw=dot:rc=255:gc=128:bc=0,format=yuva420p[osc];[0:v][osc]overlay=W*0.5-240:H*0.5-240" -c:a copy out.mp4

waveform — Imagen estática de forma de onda

Renderiza toda la pista de audio como un único PNG de forma de onda — el look "audiograma" común en covers de podcast y clips transcodificados de audio-a-video.

  • Fuente: src/commands/waveform.js
  • Filtro: aformat=channel_layouts=mono,showwavespic=s=<W>x<H>:colors=<hex>
  • Salida: <input-stem>-waveform.png (.png forzado)
Argumento / OpciónPor defectoNotas
<input>requeridoAudio/video de entrada
--size <WxH>1920x200Tamaño de la imagen — más ancho para covers de podcast, más alto para displays estilo vinilo
--color <hex>0x00FF00Color hex (cualquier spec de color FFmpeg válida — 0xRRGGBB o Color@Alpha)
-o, --output <path><input-stem>-waveform.png
bash
$ npx fqmpeg waveform song.mp3 --dry-run

  ffmpeg -i song.mp3 -filter_complex aformat=channel_layouts=mono,showwavespic=s=1920x200:colors=0x00FF00 -frames:v 1 song-waveform.png

Suma mono primero: aformat=channel_layouts=mono downmixea el audio antes de renderizar. Es intencional — una imagen de forma de onda estéreo con dos trazas apiladas es más difícil de leer que una traza combinada, y el PNG estático tampoco puede mostrar movimiento estéreo. Si quieres display de dos canales, quita el paso aformat y ajusta showwavespic:

bash
ffmpeg -i song.mp3 -filter_complex "showwavespic=s=1920x400:colors=0x00FF00|0xFF6600:split_channels=1" -frames:v 1 song-stereo.png

PNG único vía -frames:v 1: showwavespic produce un frame que contiene la forma de onda completa. El flag le dice a FFmpeg que escriba una sola imagen en lugar de una secuencia.

spectrum — Imagen estática de espectrograma

Renderiza un espectrograma frecuencia-vs-tiempo del audio como un PNG único. Úsalo para encontrar zumbido no deseado (línea horizontal de 60 Hz), hiss de alta frecuencia (energía sobre 8 kHz), o visualizar la firma espectral de una pista para arte de portada.

  • Fuente: src/commands/spectrum.js
  • Filtro: showspectrumpic=s=<W>x<H>:color=<scheme>
  • Salida: <input-stem>-spectrum.png (.png forzado)
Argumento / OpciónPor defectoPermitidoNotas
<input>requeridoAudio/video de entrada
--size <WxH>1920x512string de resoluciónTamaño del área del espectro; la leyenda por defecto añade márgenes, así que el PNG final es más grande (~2200×640 con 1920x512)
--color <mode>intensityintensity, rainbow, moreland, nebulae, fire, fiery, fruit, cool, magma, green, viridis, plasma, cividis, terrainEsquema de color
-o, --output <path><input-stem>-spectrum.png
bash
$ npx fqmpeg spectrum song.mp3 --dry-run

  ffmpeg -i song.mp3 -filter_complex showspectrumpic=s=1920x512:color=intensity -frames:v 1 song-spectrum.png
bash
$ npx fqmpeg spectrum song.mp3 --color viridis --dry-run

  ffmpeg -i song.mp3 -filter_complex showspectrumpic=s=1920x512:color=viridis -frames:v 1 song-spectrum.png

Leer un espectrograma: el tiempo va horizontalmente (izq → der), la frecuencia va verticalmente (baja abajo, alta arriba, escala log), color = energía. Una pista de voz limpia muestra energía concentrada 100 Hz–4 kHz con huecos para respiración; un kick drum es una raya vertical a 60–100 Hz; un zumbido de ground-loop indeseado es una línea perfectamente horizontal a 50 o 60 Hz. Para trabajo de masterización, el espectrograma es diagnóstico más rápido que EQ-con-analizador-de-espectro.

showspectrumpic vs showspectrum: el sufijo pic produce una imagen estática del archivo entero. La versión sin pic produce un video animado (que es lo que usa audio-visualize --mode spectrum). No los confundas.

Recetas del Mundo Real

Receta 1: Podcast con dos micrófonos — dividir pistas → normalizar → reunir

Un setup común de podcast estilo Zoom graba a ambos hablantes en un único archivo estéreo: anfitrión a la izquierda, invitado a la derecha. Para masterizarlos individualmente (ganancia diferente, EQ diferente) y reensamblar:

bash
# Paso 1: extraer cada lado
npx fqmpeg extract-audio-channel raw.wav left -o host.wav
npx fqmpeg extract-audio-channel raw.wav right -o guest.wav

# Paso 2: normalizar cada uno (verbo C9)
npx fqmpeg normalize host.wav -o host-n.wav
npx fqmpeg normalize guest.wav -o guest-n.wav

# Paso 3: mezclar de vuelta a un archivo estéreo con cada uno en su lado original
ffmpeg -i host-n.wav -i guest-n.wav \
  -filter_complex "[0:a]apad,pan=stereo|c0=c0|c1=0[hL];[1:a]apad,pan=stereo|c0=0|c1=c0[gR];[hL][gR]amerge=inputs=2,pan=stereo|c0=c0+c2|c1=c1+c3" \
  podcast-final.wav

El último paso usa raw FFmpeg porque fqmpeg no tiene un verbo "estéreo-desde-dos-monos". La cadena pan coloca al anfitrión a la izquierda y al invitado a la derecha, luego amerge combina, luego un pan final colapsa de vuelta a estéreo real.

Receta 2: Clase multilingüe — un video, tres pistas de audio

Tienes un video de clase de 50 minutos y tres dubs de voiceover (japonés, inglés, español). Quieres un único MKV con los tres streams de audio para subidas a YouTube / CMS escolares:

bash
# Todos los voiceovers deben tener ya la misma duración que el video.
# (Si no, trímalos o haz padding con fqmpeg trim primero.)
npx fqmpeg multi-audio lecture.mp4 lecture-ja.aac lecture-en.aac lecture-es.aac
# → lecture-multi-audio.mkv

La salida es un MKV con el video original, la pista de audio original (si la había), y tres streams de audio adicionales. Reproductores que soportan selección de pista (VLC, mpv, HTML5 video moderno) dejan al espectador cambiar de idioma sin descargas separadas.

Receta 3: Subida de audio YouTube con fondo de forma de onda

Para un podcast de entrevista que quieres subir a YouTube. YouTube necesita video, pero solo tienes audio. Genera un video de forma de onda reactiva al audio como visual:

bash
# Paso 1: renderizar un video animado de forma de onda (duración completa)
npx fqmpeg audio-visualize interview.mp3 --size 1920x1080 -o interview-visual.mp4

# Paso 2: cambiar el audio (silencioso) del visualizador por el original
npx fqmpeg replace-audio interview-visual.mp4 interview.mp3 -o interview-final.mp4

audio-visualize produce un video con el audio incrustado también, pero si quisieras superponer otra pista (p.ej. el visual encima de una versión normalizada, o el original con una intro diferente), replace-audio cambia limpiamente.

Para una miniatura de la misma entrevista, usa spectrum para generar un PNG de espectrograma único:

bash
npx fqmpeg spectrum interview.mp3 --color viridis --size 1920x1080 -o interview-cover.png

Preguntas Frecuentes

¿stereo --mode 5.1 y surround son realmente idénticos?

Sí — ambos ejecutan ffmpeg -i input -ac 6 -c:v copy output. La única diferencia es el sufijo del nombre del archivo de salida (-5.1 vs -surround) y el nombre del comando. fqmpeg expone dos porque los usuarios los descubren por modelos mentales diferentes — "quiero cambiar el número de canales" cae en stereo; "quiero 5.1 surround" cae en surround.

¿Por qué pan-audio --position 0 suena más fuerte que --position 1?

Porque la ley de pan es atenuación-lineal con recorte a la unidad, no equal-power. En posición 0, ambos canales están a ganancia 1.0. En posición 1 (full derecha), left = 0 y right = 1. Sumado a mono, posición 0 es L+R = 2.0 = +6 dB, mientras que posición 1 es solo R = 1.0. Para conseguir pan equal-power donde la suma mono se mantiene constante, escribe el filtro pan tú mismo con ganancias sqrt: c0=sqrt(1-p)*c0|c1=sqrt(1+p)*c1 (donde p está en 0–1).

bit-depth 24 falla con mi archivo MP4 — ¿por qué?

Porque MP4 (ISO BMFF) no acepta pcm_s24le como codec de audio. Los cambios de bit-depth solo funcionan en contenedores que soportan PCM: .wav, .mkv, .aiff, .flac. O convierte el audio de tu MP4 a WAV primero (ffmpeg -i in.mp4 -vn -c:a pcm_s16le audio.wav), ejecuta bit-depth en el WAV, luego re-mux. O cambia la extensión de salida a .mkv vía -o video-24bit.mkv.

¿Por qué está el BGM tan bajo en mix-audio --volume 0.3?

Porque el filtro amix de FFmpeg divide su salida por el número de entradas (para prevenir clipping). Con 2 entradas, cada una se divide a la mitad antes de sumar, así que tu BGM en volume=0.3 acaba efectivamente al 15 % del nivel original (0.3 / 2 = 0.15, alrededor de −16 dB). El audio original también se divide a la mitad y luego se suman. Si el BGM se siente demasiado bajo relativo al diálogo, prueba --volume 0.6 para "notable pero no dominante" o --volume 1.0 para una mezcla aproximadamente igual.

¿Puedo concatenar archivos de audio de diferentes sample rates / codecs?

No con concat-audio — usa el demuxer concat, que requiere idéntico codec + sample rate + layout de canales para stream-copy. Si tus partes difieren, hay dos opciones: (1) re-encodearlas a un formato común primero (p.ej. npx fqmpeg sample-rate part1.mp3 48000 -o part1-48k.mp3 para cada una), o (2) usar el filtro concat directamente en raw FFmpeg, que re-encodea todo:

bash
ffmpeg -i p1.mp3 -i p2.wav -i p3.aac -filter_complex "[0:a][1:a][2:a]concat=n=3:v=0:a=1[out]" -map "[out]" joined.mp3

¿Por qué audio-visualize --mode waves siempre sale verde?

Porque la invocación del filtro subyacente hardcodea colors=0x00FF00 (verde terminal, color de marca de 32blog). La opción --color no existe en este verbo. Para un color diferente, toma la salida --dry-run, edita el valor hex e invoca FFmpeg directamente. El comando waveform estático expone --color, así que para una elección de color one-off, genera una imagen estática y úsala como póster en lugar de un visualizador animado.

¿En qué se diferencia audio-visualize --mode spectrum de spectrum?

audio-visualize --mode spectrum produce un video animado (espectrograma con scroll, filtro showspectrum, salida .mp4). spectrum produce una imagen estática única (toda la pista como un PNG, filtro showspectrumpic, salida .png). Usa el animado como fondo de video para una subida de audio; usa el estático como arte de portada o para diagnóstico de un vistazo.

¿multi-audio re-encodea algo?

No — cada stream es -c copy. Tanto el video como todas las pistas de audio se stream-copian. Esto significa que los archivos de audio de entrada deben estar ya en un formato que el contenedor de salida (.mkv por defecto) acepte. AAC, MP3, Opus, Vorbis y PCM funcionan. Si intentas multiplexar un Apple Lossless (ALAC) en un .mp4 estricto, funcionará (MP4 sí soporta ALAC), pero algunos navegadores no lo reproducirán.

Cerrando

Los catorce verbos de C11 se sitúan entre "tengo una pista de audio" y "tiene la forma correcta para el entregable":

  • stereo, surround, extract-audio-channel, pan-audio para layout de canales (los dos primeros son wrappers finos de -ac; pan-audio usa atenuación lineal, no equal-power)
  • multi-audio, mix-audio, replace-audio, concat-audio para ensamblado multi-pista (el amix de mix divide cada entrada a la mitad — sube --volume si el BGM se siente bajo; concat requiere idéntico codec/SR/layout para stream-copy)
  • sample-rate, bit-depth para conversión de formato (bit-depth es solo PCM — dale WAV o MKV, no MP4)
  • audio-visualize, oscilloscope, waveform, spectrum para visualización (los visualizadores animados pintan en colores fijos; las imágenes estáticas son el workflow "audiograma" para arte de portada)

Cada verbo imprime su invocación FFmpeg subyacente bajo --dry-run, así que cuando la superficie simplificada no alcanza (leyes de pan personalizadas, concat multi-codec, espectrogramas de dos canales), copia el filtro, edita y llama a FFmpeg directamente. Para el mapa más amplio de fqmpeg, mira la fqmpeg complete guide.