안녕하세요, 빠른 질문입니다. 사용자가 WebM 파일을 업로드하고 FFmpeg를 사용하여 mp4로 변환 할 수 있도록하고 싶습니다. 백엔드에 Nodejs를 사용하고 있으며 Amazon S3 파일 스토리지에 파일을 업로드하는 경로가 이미 있습니다. 하지만 내가 그 파일을 보내고 어디에도 저장하지 않고 요청 자체에서 mp4로 변환하고 싶다고 가정 해 보겠습니다. 그렇지 않은 경우 s3 파일 URL을 가져 와서 mp4로 변환 할 수 있습니까? 누구든지 가능한 일과이를 수행하는 가장 좋은 방법에 대해 올바른 방향으로 나를 가리킬 수 있습니까?
기본적으로 제가하고 싶은 것은
const objectUrl = createObjectURL(Blob);
ffmpeg -i objectURL S3OutputLocation
또는
ffmpeg -i myS3InputLocation myS3OutputLocation
좋습니다.이 작업을 수행하려면 몇 가지해야 할 일이 있습니다. 1. s3로 이동하기 전에 파일을 로컬로 업로드해야하므로 multer의 로컬 인스턴스를 설정해야합니다. s3로 직접 시도했지만 파일을 먼저 서버에 쓰는 것보다 훨씬 오래 걸리는 많은 비용과 시간 소모적 인 읽기 작업을 사용하는 것 같습니다. 이것이 최선의 해결책이라는 것을 알았습니다.
다음과 같이합니다.
const localStorage = multer.diskStorage({
destination: function(req, file, cb) {
const destination = __dirname + "\\canvas-uploads";
console.log("destination", destination);
cb(null, destination);
},
filename: function(req, file, cb) {
const filename = req.body.id + "." + file.mimetype.toString().slice(file.mimetype.toString().lastIndexOf("/") + 1);
console.log("filename", filename);
cb(null, filename);
}
});
const uploadLocal = multer({
storage: localStorage
});
다음과 같이합니다.
router.post('/upload-temp', uploadLocal.array("upload"), async(req, res, next) =>{
res.json({id: req.body.id});
});
router.post('/ffmpeg', async(req, res, next) => {
try {
const reqPath = path.join(__dirname, '../upload/canvas-uploads/');
const {id, type} = req.body;
const localFileInput = `${reqPath}${id}.webm`;
const localFileOutput = `${reqPath}${id}.${type}`;
console.log("localInput", localFileInput);
console.log("localOutput", localFileOutput);
const key = `canvas/${id}.${type}`;
await new Promise((resolve, reject) => {
ffmpeg().input(localFileInput)
.withOutputFormat(type)
.output(localFileOutput)
.on('end',async ()=> {
const fileContent = await fs.readFileSync(localFileOutput);
await fs.unlinkSync(localFileInput);
await fs.unlinkSync(localFileOutput);
const params = {
Bucket: process.env.BUCKET_NAME,
Key: key,
Body: fileContent
}
await s3.putObject(params).promise();
resolve();
}).run();
})
res.send("success")
} catch(error){
console.log(error);
res.send(error);
}
});
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения