Node.js 为什么在谷歌云功能上发布的ffmpeg可以抛出;错误:输出流错误:超过最大调用堆栈大小“;?
我正在尝试使用在谷歌云功能上运行的ffmpeg处理视频文件。视频文件从谷歌文件存储器下载,通过fluent ffmpeg流式处理,并流式传输到新的谷歌存储文件。它在较小的文件上工作,但在较大的文件上抛出“输出流错误:超过最大调用堆栈大小” 我试着在普通pc上运行代码,但我没有遇到这个错误,即使是较大的文件 这些是我部署函数时使用的参数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
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分钟。如果有人选择此作为正确答案,将非常感谢。