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-runverificada) - 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.
| Grupo | Verbos | Qué hacen |
|---|---|---|
| Layout de canales | stereo, surround, extract-audio-channel, pan-audio | Cambia número de canales, aísla un lado, posiciona en el campo estéreo |
| Ensamblado multi-pista | multi-audio, mix-audio, replace-audio, concat-audio | Añade pistas, mezcla BGM, reemplaza audio, une clips |
| Formato y calidad | sample-rate, bit-depth | Resamplea a un Hz objetivo, cambia bit depth PCM |
| Visualización | audio-visualize, oscilloscope, waveform, spectrum | Renderiza video animado, overlay vectorscope, genera PNG estático de waveform / espectrograma |
Cinco cosas a saber antes de seguir leyendo:
stereoysurroundson 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 —surroundes literalmentestereo --mode 5.1. Si necesitas un upmix estéreo→5.1 creíble, usa el filtrosurroundde FFmpeg directamente (cosa distinta — es un upmixer que sigue el envolvente).pan-audioes 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.bit-depthsolo funciona en contenedores compatibles con PCM. Fuerzapcm_s16le/pcm_s24le/pcm_s32lecomo 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.audio-visualizey los visualizadores estáticos vienen con colores / layouts fijos.audio-visualize --mode wavespinta en0x00FF00(verde terminal);--mode spectrumescolor=intensity. Elwaveformestático también es0x00FF00por defecto (pero expone--color). Elspectrumestático expone 14 esquemas de color vía--color. El overlayoscilloscopees unavectorscopefijo de tamaño 320×320 colocado al 70 % de la pantalla.multi-audiorecomienda.mkvporque 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.
- Fuente:
src/commands/stereo.js - Flag:
-ac <1|2|6> - Salida:
<input-stem>-<mode>.<ext>
| Argumento / Opción | Por defecto | Permitido | Notas |
|---|---|---|---|
<input> | requerido | — | Video/audio de entrada |
--mode <mode> | stereo | mono, stereo, 5.1 | Mapea a -ac 1, -ac 2, -ac 6 |
-o, --output <path> | <input-stem>-<mode>.<ext> | — | Sobrescribir salida |
$ npx fqmpeg stereo input.mp4 --mode mono --dry-run
ffmpeg -i input.mp4 -ac 1 -c:v copy input-mono.mp4
$ 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:
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.
- Fuente:
src/commands/surround.js - Flag:
-ac 6 - Salida:
<input-stem>-surround.<ext>
| Argumento / Opción | Por defecto | Notas |
|---|---|---|
<input> | requerido | Video/audio de entrada |
-o, --output <path> | <input-stem>-surround.<ext> | Sobrescribir salida |
$ 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).
- Fuente:
src/commands/extract-audio-channel.js - Filtro:
pan=mono|c0=FL(left) /pan=mono|c0=FR(right) - Salida:
<input-stem>-<channel>.<ext>
| Argumento | Requerido | Permitido | Notas |
|---|---|---|---|
<input> | sí | — | Video/audio de entrada |
<channel> | sí | left, right | Qué lado conservar |
-o, --output <path> | no | — | Sobrescribir salida |
$ 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>*c1dondeL = min(1, 1-p)yR = min(1, 1+p) - Salida:
<input-stem>-panned.<ext>
| Argumento / Opción | Requerido | Rango | Notas |
|---|---|---|---|
<input> | sí | — | Video/audio de entrada |
<position> | sí | -1.0 a 1.0 | 0 = centro, -1 = full izq, 1 = full der |
-o, --output <path> | no | — | Sobrescribir salida |
$ 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:
# 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.mkvforzada)
| Argumento / Opción | Requerido | Notas |
|---|---|---|
<video> | sí | Archivo de video de entrada |
<audios...> | sí (≥1) | Archivos de audio adicionales |
-o, --output <path> | no | Sobrescribir salida (.mkv recomendado) |
$ 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ón | Por defecto | Rango | Notas |
|---|---|---|---|
<input> | requerido | — | Video de entrada |
<audio> | requerido | — | Audio para mezclar |
--volume <level> | 0.3 | 0.0 a 1.0 | Volumen del audio mezclado |
--shortest | off | flag | Terminar la salida cuando termine el stream más corto |
-o, --output <path> | <input-stem>-mixed.<ext> | — | Sobrescribir salida |
$ 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.
- Fuente:
src/commands/replace-audio.js - Flags:
-map 0:v -map 1:a -c:v copy - Salida:
<input-stem>-newaudio.<ext>
| Argumento / Opción | Por defecto | Notas |
|---|---|---|
<input> | requerido | Video de entrada |
<audio> | requerido | Nuevo archivo de audio |
--shortest | off | Terminar al final del más corto (video, nuevo audio) |
-o, --output <path> | <input-stem>-newaudio.<ext> | Sobrescribir salida |
$ 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.
- Fuente:
src/commands/concat-audio.js - Flags:
-f concat -safe 0 -i <listfile> -c copy - Salida:
<first-input-stem>-joined.<first-input-ext>
| Argumento / Opción | Requerido | Notas |
|---|---|---|
<inputs...> | sí (≥2) | Dos o más archivos de audio en orden |
-o, --output <path> | no | Sobrescribir salida |
$ 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:
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.
- Fuente:
src/commands/sample-rate.js - Flag:
-ar <rate> - Salida:
<input-stem>-<rate>hz.<ext>(p.ej.input-48000hz.mp4)
| Argumento / Opción | Requerido | Notas |
|---|---|---|
<input> | sí | Video/audio de entrada |
<rate> | sí (entero positivo en Hz) | Comunes: 44100 (CD), 48000 (video/broadcast), 96000 (masterización) |
-o, --output <path> | no | Sobrescribir salida |
$ 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.
- Fuente:
src/commands/bit-depth.js - Flag:
-c:a pcm_s16le/pcm_s24le/pcm_s32le - Salida:
<input-stem>-<bits>bit.<ext>
| Argumento | Requerido | Permitido | Notas |
|---|---|---|---|
<input> | sí | — | Video/audio de entrada (típicamente WAV) |
<bits> | sí | 16, 24, 32 | Bit depth objetivo |
-o, --output <path> | no | — | Sobrescribir salida |
$ 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(.mp4forzado)
| Argumento / Opción | Por defecto | Permitido | Notas |
|---|---|---|---|
<input> | requerido | — | Audio de entrada (también funciona video — solo se usa el stream de audio) |
--mode <mode> | waves | waves, spectrum, histogram | Estilo de visualización |
--size <WxH> | 1920x1080 | string de resolución | Tamaño del video de salida |
-o, --output <path> | <input-stem>-visualize.mp4 | — | Sobrescribir salida |
$ 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
$ 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: color0x00FF00(verde terminal), modo de dibujocline(línea centrada, scroll), tasa de refresco30fpsspectrum: modocombined(una banda por par estéreo), esquema de colorintensity, modo de scrollslide=scrollhistogram:rheight=0.5(altura relativa de barra)- Los tres: video codec
libx264+yuv420ppara 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:
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ón | Por defecto | Notas |
|---|---|---|
<input> | requerido | Video de entrada con audio |
-o, --output <path> | <input-stem>-oscilloscope.<ext> | Sobrescribir salida |
$ 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:
# 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(.pngforzado)
| Argumento / Opción | Por defecto | Notas |
|---|---|---|
<input> | requerido | Audio/video de entrada |
--size <WxH> | 1920x200 | Tamaño de la imagen — más ancho para covers de podcast, más alto para displays estilo vinilo |
--color <hex> | 0x00FF00 | Color hex (cualquier spec de color FFmpeg válida — 0xRRGGBB o Color@Alpha) |
-o, --output <path> | <input-stem>-waveform.png | — |
$ 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:
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(.pngforzado)
| Argumento / Opción | Por defecto | Permitido | Notas |
|---|---|---|---|
<input> | requerido | — | Audio/video de entrada |
--size <WxH> | 1920x512 | string de resolución | Tamañ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> | intensity | intensity, rainbow, moreland, nebulae, fire, fiery, fruit, cool, magma, green, viridis, plasma, cividis, terrain | Esquema de color |
-o, --output <path> | <input-stem>-spectrum.png | — | — |
$ npx fqmpeg spectrum song.mp3 --dry-run
ffmpeg -i song.mp3 -filter_complex showspectrumpic=s=1920x512:color=intensity -frames:v 1 song-spectrum.png
$ 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:
# 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:
# 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:
# 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:
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:
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 sí 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-audiopara layout de canales (los dos primeros son wrappers finos de-ac;pan-audiousa atenuación lineal, no equal-power)multi-audio,mix-audio,replace-audio,concat-audiopara ensamblado multi-pista (elamixde mix divide cada entrada a la mitad — sube--volumesi el BGM se siente bajo; concat requiere idéntico codec/SR/layout para stream-copy)sample-rate,bit-depthpara conversión de formato (bit-depthes solo PCM — dale WAV o MKV, no MP4)audio-visualize,oscilloscope,waveform,spectrumpara 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.