最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用FFMPEG转换文件并上传到AWS S3 Node.js

网站源码admin25浏览0评论

使用FFMPEG转换文件并上传到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
  });
  1. 为了方便起见,您需要设置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);
}
});
发布评论

评论列表(0)

  1. 暂无评论