🎧 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



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *