Мне нужно перекодировать видео из webm в mp4, когда они загружаются в хранилище firebase. У меня есть демо-версия кода, которая работает, но если загруженное видео слишком велико, функции Firebase будут отключены по тайм-ауту на меня до завершения преобразования. Я знаю, что можно увеличить лимит времени ожидания для функции, но это кажется беспорядочным, поскольку я никогда не могу подтвердить, что процесс займет меньше времени, чем ограничение времени ожидания.
Есть ли способ остановить тайм-аут firebase, не увеличивая максимальный лимит тайм-аута?
Если нет, есть ли способ завершить трудоемкие процессы (например, преобразование видео), при этом каждый процесс запускается с использованием триггеров функций Firebase?
Если даже завершение трудоемких процессов с использованием функций Firebase на самом деле не существует, есть ли способ ускорить преобразование fluent-ffmpeg, не сильно затрагивая качество? (Я понимаю, что в этой части много вопросов. Я планирую снизить качество, если мне это абсолютно необходимо, поскольку причина, по которой веб-сайты преобразуются в mp4, предназначена для устройств IOS)
Для справки, вот основная часть упомянутой мной демонстрации. Как я уже говорил, полный код можно просмотреть здесь, но эта часть скопированного кода является той частью, которая создает промис, обеспечивающий завершение транскодирования. Полный код состоит всего из 70 с чем-то строк, поэтому при необходимости его будет относительно легко просмотреть.
const functions = require('firebase-functions');
const mkdirp = require('mkdirp-promise');
const gcs = require('@google-cloud/storage')();
const Promise = require('bluebird');
const ffmpeg = require('fluent-ffmpeg');
const ffmpeg_static = require('ffmpeg-static');
(Здесь есть куча кода для синтаксического анализа текста, за которым следует следующий фрагмент кода внутри события onChange)
function promisifyCommand (command) {
return new Promise( (cb) => {
command
.on( 'end', () => { cb(null) } )
.on( 'error', (error) => { cb(error) } )
.run();
})
}
return mkdirp(tempLocalDir).then(() => {
console.log('Directory Created')
//Download item from bucket
const bucket = gcs.bucket(object.bucket);
return bucket.file(filePath).download({destination: tempLocalFile}).then(() => {
console.log('file downloaded to convert. Location:', tempLocalFile)
cmd = ffmpeg({source:tempLocalFile})
.setFfmpegPath(ffmpeg_static.path)
.inputFormat(fileExtension)
.output(tempLocalMP4File)
cmd = promisifyCommand(cmd)
return cmd.then(() => {
//Getting here takes forever, because video transcoding takes forever!
console.log('mp4 created at ', tempLocalMP4File)
return bucket.upload(tempLocalMP4File, {
destination: MP4FilePath
}).then(() => {
console.log('mp4 uploaded at', filePath);
});
})
});
});