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:
- EnvĂa los datos a /recortar-audio/create.
- Lanza un polling para seguir el progreso.
- Muestra una barra de carga hasta que el audio estĂĄ listo.
- 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