繁体   English   中英

Firebase function 总是在大文件上超时?

[英]Firebase function always timeout on large files?

I have created a firebase function that is triggered when a video is uploaded to the firebase storage and by using ffmpeg it add a watermark to it, it works fine with small video sizes but it always timeout in large ones. 知道如何克服这些限制

const functions = require('firebase-functions');
const { Storage, Bucket } = require('@google-cloud/storage');
const projectId = 'video-sharing-a57fa';
const admin = require('firebase-admin');
admin.initializeApp();

let gcs = new Storage({
    projectId
});
const os = require('os');
const path = require('path');
const spawn = require('child-process-promise').spawn;


exports.addLogo = functions.runWith({ memory: '4GB', timeoutSeconds: 540 }).storage.object().onFinalize(async event => {

const bucket = event.bucket;
const contentType = event.contentType;
const filePath = event.name;
console.log('File change detected, function execution started');
if (path.basename(filePath).startsWith('resized-')) {
    console.log('We already renamed that file!');
    return;
}
const destBucket = gcs.bucket(bucket);
const tmpFilePath = path.join(os.tmpdir(), path.basename(filePath));
const metadata = { contentType: contentType };
const tmpLogoPath = path.join(os.tmpdir(), 'watermark.png');
await destBucket.file('watermark.png').download({
    destination: tmpLogoPath
})

const newPath = path.join(os.tmpdir(), 'output.mp4')

return destBucket.file(filePath).download({
        destination: tmpFilePath
    }).then(() => {
        console.log('entered spawn');
        var str = "overlay=10:10"
        return spawn('ffmpeg', ['-i', tmpFilePath, '-i', tmpLogoPath, '-filter_complex', str, newPath]);
    }).then(() => {
        console.log('chaning the name');
        return destBucket.upload(newPath, {
            destination: path.dirname(filePath) + '/resized-' + path.basename(filePath),
            metadata: metadata
        })
    });

})

云函数的执行时间有限,最多限制为 9 分钟 更多信息 在这里 最有可能的问题是ffmpeg没有及时添加水印。 你的行动应该是:

  1. 检查 function 的日志,确认这正是错误firebase functions:log --only <FUNCTION_NAME>
  2. 考虑不同的架构选项来处理非常大的文件:
    一个。 限制ffmpeg进程的数据量,例如使用-ss 50 -t 10 在这种情况下,将有以下架构:a) 一个 function 读取文件并将它们放入队列,b) 一个 function 读取文件大小并将数据放入另一个队列,例如{name: "file1.mp4", start: 10, duration: 15}
    湾。 使用Cloud Run等按需容器
    c。 如果您经常处理某些文件,请使用App Engine

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM