Next.js App Router API Route: @ffmpeg-installer/ffmpeg löst die Fehler „Modul nicht gefunden“ und „Serverrelative ImportJavaScript

Javascript-Forum
Anonymous
 Next.js App Router API Route: @ffmpeg-installer/ffmpeg löst die Fehler „Modul nicht gefunden“ und „Serverrelative Import

Post by Anonymous »

Ich versuche, eine WebM-Videodatei mit fluent-ffmpeg und @ffmpeg-installer/ffmpeg in einer Next.js 14-API-Route (unter Verwendung des App Routers) in MP4 zu konvertieren. Der gleiche Code funktionierte perfekt in einem eigenständigen Node.js-Skript, aber beim Verschieben nach Next.js erhalte ich während der Laufzeit eine Fehlermeldung.

Code: Select all

import { NextRequest, NextResponse } from "next/server";
import { getSession } from "@/lib/session";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import ffmpeg from "fluent-ffmpeg";
import ffmpegInstaller from "@ffmpeg-installer/ffmpeg";
import { writeFile, unlink, mkdir, readFile } from "fs/promises";
import { existsSync } from "fs";
import path from "path";
import { tmpdir } from "os";

const s3Client = new S3Client({
region: process.env.AWS_REGION!,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!
}
});

ffmpeg.setFfmpegPath(ffmpegInstaller.path);

export async function POST(request: NextRequest) {
try {
const user = await getSession();
if (!user) {
return NextResponse.json(
{ success: false, message: "Unauthorized" },
{ status: 401 }
);
}

const formData = await request.formData();
const file = formData.get("file") as File;

if (!file) {
return NextResponse.json(
{ success: false, message: "No file found" },
{ status: 400 }
);
}

const tempDir = path.join(tmpdir(), "video-conversion");
if (!existsSync(tempDir)) {
await mkdir(tempDir, { recursive: true });
}

const inputPath = path.join(tempDir, `${Date.now()}-input.webm`);
const outputPath = path.join(tempDir, `${Date.now()}-output.mp4`);

// Write uploaded file to disk
const buffer = Buffer.from(await file.arrayBuffer());
await writeFile(inputPath, buffer);

// Convert video using ffmpeg
await new Promise((resolve, reject) => {
ffmpeg(inputPath)
.outputOptions(["-c:v libx264", "-preset fast", "-crf 23", "-r 30"])
.toFormat("mp4")
.on("end", () => resolve())
.on("error", err => reject(err))
.save(outputPath);
});

// Upload to S3
const key = `${user.id}/${Date.now()}.mp4`;
const convertedBuffer = await readFile(outputPath);

await s3Client.send(
new PutObjectCommand({
Bucket: process.env.AWS_S3_BUCKET!,
Key: key,
Body: convertedBuffer,
ContentType: "video/mp4"
})
);

// Cleanup temp files
await Promise.all([
unlink(inputPath).catch(() => {}),
unlink(outputPath).catch(() => {})
]);

return new NextResponse(convertedBuffer, {
headers: {
"Content-Type": "video/mp4",
"Content-Length": convertedBuffer.length.toString()
}
});
} catch (error) {
console.error("Video conversion failed:", error);
return NextResponse.json(
{ success: false, message: "Video conversion failed" },
{ status: 500 }
);
}
}
Es hat funktioniert, als ich es in Node js gemacht habe, aber als ich versuchte, es in „Next“ zu konvertieren, erhalte ich die folgende Fehlermeldung:

Code: Select all

 ⨯ ./node_modules/@ffmpeg-installer/ffmpeg
Module not found: Can't resolve './ROOT/node_modules/@ffmpeg-installer/ffmpeg/node_modules/@ffmpeg-installer/win32-x64/package.json'
server relative imports are not implemented yet. Please try an import relative to the file you are importing from.
Fragen
Warum schlägt @ffmpeg-installer/ffmpeg mit diesem Importauflösungsfehler in Next.js fehl?
Jede Hilfe oder Problemumgehung wäre sehr dankbar!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post