DEV Community

Cover image for 🎧 Cómo hice un recortador de audio MP3 online con FastAPI + FFmpeg
Mario
Mario

Posted on

🎧 Cómo hice un recortador de audio MP3 online con FastAPI + FFmpeg

Hace poco añadí a mi convertidor de audio MP3 online — convertiraudioamp3.com una nueva herramienta:
➡️ Recortar audios largos y descargarlos en MP3, directamente online.

Detrás hay un trabajo interesante con FastAPI, FFmpeg, un poco de JavaScript moderno y un enfoque muy ligero pero escalable.

El objetivo

Ofrecer algo más que convertir audios de WhatsApp:

  • Permitir recortar audios largos (voz o mĂşsica).
  • Que funcione con formatos comunes: .opus, .ogg, .amr, .m4a, .mp3, .wav…
  • Procesar el audio en el servidor (seguro, compatible, rápido).
  • Mantener una experiencia fluida, sin recargar la página.

La arquitectura

🖥️ Backend

FastAPI gestiona tres endpoints:

  • /recortar-audio/create → crea el trabajo y lanza FFmpeg.
  • /recortar-audio/status/{id} → devuelve el progreso.
  • /recortar-audio/download/{id} → permite descargar el MP3 final.

  • El trabajo se ejecuta en un hilo separado usando subprocess.Popen con FFmpeg, leyendo su salida (-progress pipe:1) para actualizar el porcentaje en tiempo real.

  • Se utiliza reCAPTCHA v3 en cada solicitud para evitar abusos automáticos, y se registra cada conversiĂłn en un log CSV para analĂ­tica.

🚀 Lanzar FFmpeg y seguir el progreso

Una de las claves fue capturar la salida de FFmpeg en tiempo real para mostrar progreso al usuario:

def _run_ffmpeg_trim_with_progress(src, dst, start, end, bitrate, job):
dur = max(0.01, end - start)
cmd = [
"ffmpeg", "-hide_banner", "-y",
"-ss", str(start), "-i", src,
"-t", str(dur),
"-vn", "-acodec", "libmp3lame",
"-b:a", bitrate, "-ar", "44100", "-ac", "2",
"-progress", "pipe:1", dst
]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, text=True)
job["status"] = "running"
for line in proc.stdout:
if line.startswith("out_time_ms="):
out_s = int(line.split("=")[1]) / 1_000_000
job["progress"] = round((out_s / dur) * 100, 1)

Cada línea con out_time_ms nos dice cuántos microsegundos lleva procesados FFmpeg.
Con eso, actualizamos el progreso en memoria y lo consultamos por API.

⚡ API asíncrona con FastAPI

@router.post("/recortar-audio/create")
async def recortar_audio_create(request: Request, file: UploadFile = File(...),
inicio: float = Form(...), fin: float = Form(...)):
src = UPLOAD_DIR / f"{uuid.uuid4().hex}.mp3"
with src.open("wb") as buf:
shutil.copyfileobj(file.file, buf)
job_id = uuid.uuid4().hex
job = {"status": "queued", "progress": 0}
JOBS[job_id] = job
threading.Thread(target=_run_ffmpeg_trim_with_progress,
args=(str(src), f"{src.stem}_trim.mp3", inicio, fin, "128k", job),
daemon=True).start()
return {"job_id": job_id, "poll_url": f"/recortar-audio/status/{job_id}"}

Con FastAPI y un hilo simple conseguimos asincronĂ­a real sin dependencias pesadas.
Ideal para cargas ligeras y VPS pequeños.

đź’ˇ Frontend

Creamos un formulario accesible y responsive, con inputs para:

  • Subir el archivo de audio.
  • Definir los segundos de inicio y fin.
  • Seleccionar la calidad MP3 (64k–320k).

El formulario se comunica por AJAX, usando un script JS que:

  1. EnvĂ­a los datos a /recortar-audio/create.
  2. Lanza un polling para seguir el progreso.
  3. Muestra una barra de carga hasta que el audio está listo.
  4. Finalmente, ofrece un enlace de descarga directa al MP3.

Todo se integra en el bundle generado con esbuild, para mantener el rendimiento óptimo y evitar problemas de caché.

Despliegue y rendimiento

El backend corre tras un proxy Nginx, con:

proxy_set_header X-Forwarded-Proto $scheme;

para que FastAPI detecte correctamente el https:// en las URLs de descarga.

El procesamiento con FFmpeg en servidor es sorprendentemente rápido incluso en VPS modestos. Para audios largos, se recomienda:

  • Limitar tamaño/duraciĂłn (por ejemplo, 200 MB o 60 min).
  • Limpiar los temporales a diario.
  • Registrar conversiones con fecha, IP y duraciĂłn para análisis.

Resultado final: un recortador de audio MP3 online, ligero y privado

Después de montar el endpoint y el formulario, obtuvimos una herramienta funcional que permite subir un audio, elegir los segundos de inicio y fin, y obtener el MP3 recortado en segundos.
Todo ocurre en el servidor con FFmpeg y FastAPI, sin depender de servicios externos.

👉 Puedes probar la versión online aquí:
Recortar audio MP3 online — convertiraudioamp3.com

Top comments (0)