Comprimir audio a MP3 en la web: guía para programadores

Si desarrollas aplicaciones web con subida de audio, tarde o temprano necesitarás un flujo para convertir y comprimir a MP3 con buen equilibrio entre tamaño y calidad. En esta guía verás cuándo usar FFmpeg en servidor, cuándo optar por ffmpeg.wasm en el navegador, y qué presets y bitrates funcionan mejor para voz y música, especialmente en audios que llegan desde WhatsApp o Telegram.

🎯 ¿Solo quieres hacerlo ya mismo?

Gratis • Online • Funciona en móvil y ordenador

Arquitecturas: cliente vs. servidor

Hay dos enfoques principales para convertir/comprimir audio en una app web. Elegir uno u otro depende del tamaño de los ficheros, del presupuesto y de la compatibilidad que busques.

Servidor con FFmpeg

  • Robusto, rápido y con bajo consumo en el cliente.
  • Escalable con colas (RabbitMQ, SQS) y workers.
  • Control total de códecs, filtros y normalización.

Ideal para cargas masivas, backend ya existente o workflows controlados.

Navegador con ffmpeg.wasm

  • Privacidad: el archivo no sale del dispositivo.
  • Menos infraestructura y sin colas.
  • Más uso de CPU y RAM en el cliente; conviene usar Web Workers.

Útil para notas de voz o tareas ligeras; evita procesados largos en móviles antiguos.

Presets de calidad recomendados

Ejemplos de código

FFmpeg CLI (servidor)

# Voz clara (mono) a 96 kbps
ffmpeg -i input.m4a -ac 1 -c:a libmp3lame -b:a 96k output.mp3

# Música a 192 kbps CBR
ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3

# VBR de calidad alta (~170–210 kbps)
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3

Node.js (fluent-ffmpeg)

import ffmpeg from "fluent-ffmpeg";

function aMp3Voz(inputPath, outPath) {
  return new Promise((res, rej) => {
    ffmpeg(inputPath)
      .audioChannels(1)
      .audioCodec("libmp3lame")
      .audioBitrate("96k")
      .on("end", res)
      .on("error", rej)
      .save(outPath);
  });
}

Python (pydub + FFmpeg)

from pydub import AudioSegment
audio = AudioSegment.from_file("input.opus")
audio.set_frame_rate(44100).set_channels(1).export("out.mp3", format="mp3", bitrate="96k")

En el navegador con ffmpeg.wasm

import { createFFmpeg, fetchFile } from "@ffmpeg/ffmpeg";
const ffmpeg = createFFmpeg({ log: false });

async function convertirEnCliente(file) {
  if (!ffmpeg.isLoaded()) await ffmpeg.load();
  ffmpeg.FS("writeFile", "in.m4a", await fetchFile(file));
  await ffmpeg.run("-i", "in.m4a", "-ac", "1", "-c:a", "libmp3lame", "-b:a", "96k", "out.mp3");
  const data = ffmpeg.FS("readFile", "out.mp3");
  return new Blob([data.buffer], { type: "audio/mpeg" });
}

Consejo: ejecuta ffmpeg.wasm dentro de un Web Worker para no bloquear la UI y muestra progreso usando ffmpeg.setProgress.

UX para audios de móvil (WhatsApp/Telegram)

Rendimiento, costes y seguridad

Rendimiento

  • Normaliza a 44,1 kHz cuando la fuente lo permita para evitar reprocesados.
  • Procesa en cola y responde con webhook si el archivo es grande.
  • Cachea resultados repetidos por hash (MD5/SHA-256).

Seguridad/privacidad

  • Valida MIME y extensión; limita duración/tamaño.
  • Elimina ficheros temporales tras la conversión.
  • Ofrece procesado local con ffmpeg.wasm cuando la privacidad sea clave.

Preguntas frecuentes

¿CBR o VBR para la web?

En voz, CBR 96–128 kbps es predecible y estable; en música, VBR alto (-q:a 2) mantiene calidad con pesos contenidos.

¿Qué hago con OPUS/OGG de WhatsApp?

Convierte a un formato universal para compatibilidad en coche/TV. Sigue esta guía de OPUS → MP3.

¿Puedo recomprimir un MP3 para que pese menos?

Sí, pero evita múltiples pasadas. Usa una sola conversión a tu destino (por ejemplo, comprimir un MP3 existente).

Convertir audio ahora

Online • Gratis • Compatible con móvil y PC