Конвертируйте файл с помощью FFMPEG и загрузите в AWS S3 Nodejs - PullRequest
0 голосов
/ 13 апреля 2020

Привет всем, такой быстрый вопрос, я хочу разрешить пользователю загружать файл WebM и конвертировать его с помощью FFmpeg в mp4. Я использую Nodejs для бэкэнда и уже имею маршрут, который загружает файлы в хранилище файлов Amazon S3. Но допустим, я хотел отправить этот файл и не хранить его где-либо, а преобразовать его в mp4 из самого запроса, это возможно? Если нет, то возможно ли взять URL файла s3 и преобразовать его в mp4? Кто-нибудь может указать мне правильное направление относительно того, что возможно и лучший способ сделать это?

В основном все, что я хочу сделать, это

const objectUrl = createObjectURL(Blob);
ffmpeg -i objectURL S3OutputLocation

или

ffmpeg -i myS3InputLocation myS3OutputLocation

1 Ответ

0 голосов
/ 06 мая 2020

Хорошо, есть несколько вещей, которые вы должны сделать, чтобы сделать эту работу. 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 и обернуть его в обещание, чтобы вы могли быть уверены, что он завершен со всей вашей обработкой (загрузка в s3 и et c по тому же маршруту.) Для удобства.

вы делаете это так:

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);
}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...