From 21a68e87e74445807cecf5da87f74cd8a1253f20 Mon Sep 17 00:00:00 2001 From: theoleuthardt Date: Sat, 22 Feb 2025 23:27:33 +0100 Subject: [PATCH] fix: ffmpeg now uses right encoder for every supported input format --- backend/src/routes/videotoaudio.route.ts | 21 ++++++++++++++++----- frontend/src/app/video-to-audio/page.tsx | 1 - 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/backend/src/routes/videotoaudio.route.ts b/backend/src/routes/videotoaudio.route.ts index 31ffe0a..91a5648 100644 --- a/backend/src/routes/videotoaudio.route.ts +++ b/backend/src/routes/videotoaudio.route.ts @@ -11,9 +11,14 @@ interface ConversionOptions { channels?: number; sampleRate?: number; } - let options: ConversionOptions; +const ffmpegEncoder: { [key: string]: string } = { + ".mp3": "libmp3lame", + ".wav": "pcm_s16le", + ".aac": "aac", +}; + export async function videoToAudio(app: FastifyInstance) { app.post( "/api/video-to-audio", @@ -30,7 +35,7 @@ export async function videoToAudio(app: FastifyInstance) { let fileBuffer: Buffer | null = null; options = { - format: "mp3", + format: "", bitrate: "192k", channels: 2, sampleRate: 44100, @@ -42,7 +47,7 @@ export async function videoToAudio(app: FastifyInstance) { } else if (part.type === "field") { const field = part as MultipartValue; switch (field.fieldname) { - case "format": + case "outputFormat": const format = field.value.toLowerCase(); options.format = format; break; @@ -63,6 +68,8 @@ export async function videoToAudio(app: FastifyInstance) { return reply.status(400).send({ error: "No file uploaded!" }); } + console.log("options", options); + await fs.writeFile(inputPath, fileBuffer); await new Promise((resolve, reject) => { @@ -71,7 +78,7 @@ export async function videoToAudio(app: FastifyInstance) { inputPath, "-vn", "-acodec", - options.format === "mp3" ? "libmp3lame" : options.format, + ffmpegEncoder[options.format], "-ab", options.bitrate || "192k", "-ac", @@ -83,8 +90,12 @@ export async function videoToAudio(app: FastifyInstance) { const ffmpeg = spawn("ffmpeg", args); + ffmpeg.stdout.on("data", (data) => { + console.log(`ffmpeg stdout: ${data}`); + }); + ffmpeg.stderr.on("data", (data) => { - console.log(`ffmpeg stderr: ${data}`); + console.error(`ffmpeg stderr: ${data}`); }); ffmpeg.on("close", (code) => { diff --git a/frontend/src/app/video-to-audio/page.tsx b/frontend/src/app/video-to-audio/page.tsx index cfedd34..9a4439d 100644 --- a/frontend/src/app/video-to-audio/page.tsx +++ b/frontend/src/app/video-to-audio/page.tsx @@ -114,7 +114,6 @@ export default function DocConverter() { const selectedFormat = event.currentTarget.textContent?.trim() || ""; setSelectedOutputFormat(selectedFormat); - console.log(selectedOutputFormat); }} />