Skip to content

[F2-03] Librería FFmpeg robusta (abortable, con progreso y ffprobe) #26

Open

Description

@JCCG-code

Fase: F2 · Tamaño: M · Depende de: #17 (F0-06), #21 (F1-01)

Objetivo

Una capa FFmpeg fiable sobre la que construir el montaje: cancelable, con progreso, sin rutas temporales compartidas y que nunca deja procesos o ficheros huérfanos.

Contexto

Hoy libs/ffmpeg.js usa /tmp fijo, no limpia el fichero de concat si falla, no se puede abortar ni informa de progreso de forma utilizable.

Alcance

  • apps/server/src/core/media/ffmpeg.ts: runFfmpeg(args, { workDir, signal, timeoutMs, totalDurationSec, onProgress }).
    • signal: AbortSignal mata el proceso (SIGKILL).
    • onProgress(0..1) parseando time= contra totalDurationSec.
    • Rechaza con AppError incluyendo las últimas 20 líneas de stderr.
  • ffprobe(path) → { durationSec, width, height, fps, codec, hasAudio }.
  • pcmToMp3(buffer, { sampleRate, channels, workDir }) (sustituye a saveMp3File).
  • audioToMp3(path) para normalizar audio de cualquier proveedor (wav/mp3/ogg).
  • Todas las rutas temporales dentro de workDir; nada en /tmp fijo.

Criterios de aceptación

  • Test (ffmpeg en CI): runFfmpeg con testsrc de 3 s emite al menos 2 eventos de progreso y termina en 1.
  • Test: abortar con AbortSignal mata el proceso en < 2 s y rechaza con un error de cancelación.
  • Test: pcmToMp3 de 1 s de silencio PCM 24 kHz mono → ffprobe mide entre 0,95 y 1,05 s.
  • grep -rn "'/tmp" apps/server/src/core no devuelve nada.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions