gpt4 book ai didi

node.js - 使用 FFMPEG 转换文件并上传到 AWS S3 Nodejs

转载 作者:行者123 更新时间:2023-12-04 23:22:58 24 4
gpt4 key购买 nike

嘿大家这么快的问题我想允许用户上传 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);
    }
    });

    关于node.js - 使用 FFMPEG 转换文件并上传到 AWS S3 Nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61192069/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com