文件并上传到AWS S3 Node.js"/>
使用FFMPEG转换文件并上传到AWS S3 Node.js
嘿大家这么快的问题,我想允许用户上传一个WebM文件,并使用FFmpeg将其转换为mp4。我正在使用Nodejs作为后端,并且已经有了将文件上传到Amazon S3文件存储的路由。但是,假设我想发送该文件,而不是将其存储在任何地方,而是可以从请求本身将其转换为mp4,这可能吗?如果不是,可以使用s3文件URL并将其转换为mp4吗?任何人都可以向我指出正确的方向,以了解可行的方法和最佳方法吗?
基本上我只想做
const objectUrl = createObjectURL(Blob);
ffmpeg -i objectURL S3OutputLocation
或
ffmpeg -i myS3InputLocation myS3OutputLocation
回答如下:好的,要完成这项工作,您需要做几件事。1.您需要设置multer的本地实例,因为您需要在转到s3之前在本地上传文件。我尝试直接使用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
});
- 为了方便起见,您需要设置ffmpeg-fluent并将其包装在Promise中,以便可以确保所有处理都完成了(在同一路径中上载到s3等)。
您这样做是:
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);
}
});
更多推荐
使用FFMPEG转换文件并上传到AWS S3 Node.js
发布评论