Node.js 为什么在谷歌云功能上发布的ffmpeg可以抛出;错误:输出流错误:超过最大调用堆栈大小“;?

Node.js 为什么在谷歌云功能上发布的ffmpeg可以抛出;错误:输出流错误:超过最大调用堆栈大小“;?,node.js,ffmpeg,google-cloud-functions,fluent-ffmpeg,Node.js,Ffmpeg,Google Cloud Functions,Fluent Ffmpeg,我正在尝试使用在谷歌云功能上运行的ffmpeg处理视频文件。视频文件从谷歌文件存储器下载,通过fluent ffmpeg流式处理,并流式传输到新的谷歌存储文件。它在较小的文件上工作,但在较大的文件上抛出“输出流错误:超过最大调用堆栈大小” 我试着在普通pc上运行代码,但我没有遇到这个错误,即使是较大的文件 这些是我部署函数时使用的参数 gcloud functions deploy $FUNCTION_NAME --runtime nodejs8 --trigger-http --timeout

我正在尝试使用在谷歌云功能上运行的ffmpeg处理视频文件。视频文件从谷歌文件存储器下载,通过fluent ffmpeg流式处理,并流式传输到新的谷歌存储文件。它在较小的文件上工作,但在较大的文件上抛出“输出流错误:超过最大调用堆栈大小”

我试着在普通pc上运行代码,但我没有遇到这个错误,即使是较大的文件

这些是我部署函数时使用的参数

gcloud functions deploy $FUNCTION_NAME --runtime nodejs8 --trigger-http --timeout=180 --memory 256
这是处理视频的代码

function cutVideo({videoUrl, startTime, duration, dist}) {
    return ffmpeg(videoUrl)
    .outputOptions('-movflags frag_keyframe+empty_moov')
    .videoCodec('copy')
    .audioCodec('copy')
    .format('mp4')
    .setStartTime(startTime)
    .setDuration(duration);
}

const sectionStream = cutVideo({
    videoUrl,
    startTime,
    duration,
    dist: tempFilePath,
});

const outputStream = bucket.file(sectionPath)
.createWriteStream({
    metadata: {
        contentType: config.contentType,
    },
    public: true,
});
实际的错误堆栈如下所示

  Error: Output stream error: Maximum call stack size exceeded
                                                                  at Pumpify.<anonymous> (/srv/node_modules/fluent-ffmpeg/lib/processor.js:498:34)
                                                                  at emitOne (events.js:121:20)
                                                                  at Pumpify.emit (events.js:211:7)
                                                                  at Pumpify.Duplexify._destroy (/srv/node_modules/duplexify/index.js:191:15)
                                                                  at /srv/node_modules/duplexify/index.js:182:10
                                                                  at _combinedTickCallback (internal/process/next_tick.js:132:7)
                                                                  at process._tickDomainCallback (internal/process/next_tick.js:219:9)
  RangeError: Maximum call stack size exceeded
                                                                  at replaceProjectIdToken (/srv/node_modules/@google-cloud/projectify/build/src/index.js:28:31)
                                                                  at replaceProjectIdToken (/srv/node_modules/@google-cloud/projectify/build/src/index.js:37:30)
                                                                  at replaceProjectIdToken (/srv/node_modules/@google-cloud/projectify/build/src/index.js:37:30)
                                                                  at value.map.v (/srv/node_modules/@google-cloud/projectify/build/src/index.js:30:32)
                                                                  at Array.map (<anonymous>)
                                                                  at replaceProjectIdToken (/srv/node_modules/@google-cloud/projectify/build/src/index.js:30:23)
                                                                  at replaceProjectIdToken (/srv/node_modules/@google-cloud/projectify/build/src/index.js:37:30)
                                                                  at replaceProjectIdToken (/srv/node_modules/@google-cloud/projectify/build/src/index.js:37:30)
                                                                  at value.map.v (/srv/node_modules/@google-cloud/projectify/build/src/index.js:30:32)
                                                                  at Array.map (<anonymous>)
错误:输出流错误:超过最大调用堆栈大小
在Pumpify。(/srv/node_modules/fluent-ffmpeg/lib/processor.js:498:34)
在emitOne(events.js:121:20)
在Pumpify.emit(events.js:211:7)
在Pumpify.Duplexify.\u destroy(/srv/node\u modules/Duplexify/index.js:191:15)
at/srv/node_modules/duplexify/index.js:182:10
at_combinedTickCallback(内部/流程/下一步勾选js:132:7)
在进程中。_tickDomainCallback(internal/process/next_tick.js:219:9)
RangeError:超出了最大调用堆栈大小
在replaceprojectedtoken(/srv/node_modules/@googlecloud/projectify/build/src/index.js:28:31)
在replaceprojectedtoken(/srv/node_modules/@googlecloud/projectify/build/src/index.js:37:30)
在replaceprojectedtoken(/srv/node_modules/@googlecloud/projectify/build/src/index.js:37:30)
在value.map.v(/srv/node_modules/@googlecloud/projectify/build/src/index.js:30:32)
在Array.map()处
在replaceprojectdtoken(/srv/node_modules/@googlecloud/projectify/build/src/index.js:30:23)
在replaceprojectedtoken(/srv/node_modules/@googlecloud/projectify/build/src/index.js:37:30)
在replaceprojectedtoken(/srv/node_modules/@googlecloud/projectify/build/src/index.js:37:30)
在value.map.v(/srv/node_modules/@googlecloud/projectify/build/src/index.js:30:32)
在Array.map()处

什么会导致谷歌云函数出现此错误?

除了基于内存/cpu的限制之外,由于实际超时,这些长时间运行的进程不可能适用于谷歌云函数

实现这一目标的唯一方法是使用“谷歌应用程序引擎Flex”。它本质上具有最长的可用超时机制,可以在app.yaml/gunicorn(或您打算使用的任何Web服务器)和实际GAE超时两个级别上设置


其余的服务是GAE标准或谷歌云功能,它们有一个严格的超时时间,你不能超过10秒到30分钟。这些超时时间不足以用于ffmpeg和转码目的。

您的意思是10到30秒吗?不,是10秒到30分钟。如果有人选择此作为正确答案,将非常感谢。