ffmpeg 无法在 google App Engine 标准 nodejs 中正确执行
ffmpeg won't execute properly in google app engine standard nodejs
我已经尝试了整整三天将 GAE(标准 - nodejs)转换为 运行 使用 ffmpeg 从 MOV 到 MP4 的简单视频转码器。我试过使用 ffluent-ffmpeg,启动子进程(例如 spawn),但没有任何效果。一旦它调用可执行文件,它总是会出错。我已经确认安装了 ffmpeg,甚至尝试使用 ffmpeg-static。此外,我让它在我的本地机器上正常工作(使用上述所有方法)。
我也试过记录错误,但没有任何帮助。我可以看到它通过任何已安装的包工作,包括 ffmpeg(系统包)。
下面是伪代码...第三步是问题所在。
- 将文件名发送到 GAE 端点
- 将文件从 google 云存储下载到临时文件
- 使用 ffmpeg 转码
- 将临时文件上传到 google 云存储
- 删除旧的 google 云存储文件
- 删除临时文件
我用来测试的文件是 6MB...我在 iPhone 上拍摄的 5 秒视频。提前谢谢你。
更新:我成功地将完全相同的代码部署到 Node Flex 环境中,并且一切正常。我无法在标准环境中得到任何错误,这些错误指示我去哪里看,但我猜这与它如何存储我在 GAE Node Standard 上通过管道传输到 FFMPEG 的文件有关。文档说它是一个使用 RAM 的虚拟文件系统。我很想知道是否有人设法让它在标准环境中工作。
没错,ffmpeg 列在 Node.js 运行时的 pre-installed packages 中。
但是他们没有提到安装了哪个 ffmpeg 版本。
我查看了 fluent-ffmeg prerequisites,它需要 ffmpeg >= 0.9
才能工作。
尝试更新您的 ffmpeg 版本 运行 命令:
apt-get update ffmpeg
在您实例的控制台中。告诉我们进展如何。
const outFile = bucket.file(`${storagePath}`)
//create a referance to your storage bucket path
const outStream = outFile.createWriteStream()
您可以随时为您的 ffmpeg 命令设置一个 'stderr' 侦听器。
我在 google 应用程序引擎上遇到了类似的转码问题,所以流畅的 ffmpeg stderr 侦听器帮助我调试了很多。
ffmpeg.addInput(`tmp/${app_engine_filepath})
.format('mp3')
.on('stderr', function(stderrLine) {
console.log('Stderr output: ' + stderrLine);
})
.on('error, (error) => {
console.log(error)
})
.pipe(outStream)
.on('end', () => {
fs.remove(`tmp/${app_engine_filepath}`)
})
您可能还想在标准环境中检查您的 ffmpeg 版本。 (也应该可以通过 stderrlogs 查看)
折腾了半天,终于明白是怎么回事了。我没有足够的计算资源。如果有人要为图像和视频构建转码服务,请确保您将核心至少提升到 4 个。我的作业随机失败(但不能重复处理相同的文件)、网络套接字断开连接并重新连接等。
对于因为我没有 post 一个错误(我说我真的没有)而将我的问题降级的人......好吧,在当您的 CPU 由于跟不上负载而开始丢弃作业时记录。就像我在问题中提到的那样,我会收到错误但没有任何意义。
我已经尝试了整整三天将 GAE(标准 - nodejs)转换为 运行 使用 ffmpeg 从 MOV 到 MP4 的简单视频转码器。我试过使用 ffluent-ffmpeg,启动子进程(例如 spawn),但没有任何效果。一旦它调用可执行文件,它总是会出错。我已经确认安装了 ffmpeg,甚至尝试使用 ffmpeg-static。此外,我让它在我的本地机器上正常工作(使用上述所有方法)。
我也试过记录错误,但没有任何帮助。我可以看到它通过任何已安装的包工作,包括 ffmpeg(系统包)。
下面是伪代码...第三步是问题所在。
- 将文件名发送到 GAE 端点
- 将文件从 google 云存储下载到临时文件
- 使用 ffmpeg 转码
- 将临时文件上传到 google 云存储
- 删除旧的 google 云存储文件
- 删除临时文件
我用来测试的文件是 6MB...我在 iPhone 上拍摄的 5 秒视频。提前谢谢你。
更新:我成功地将完全相同的代码部署到 Node Flex 环境中,并且一切正常。我无法在标准环境中得到任何错误,这些错误指示我去哪里看,但我猜这与它如何存储我在 GAE Node Standard 上通过管道传输到 FFMPEG 的文件有关。文档说它是一个使用 RAM 的虚拟文件系统。我很想知道是否有人设法让它在标准环境中工作。
没错,ffmpeg 列在 Node.js 运行时的 pre-installed packages 中。
但是他们没有提到安装了哪个 ffmpeg 版本。
我查看了 fluent-ffmeg prerequisites,它需要 ffmpeg >= 0.9
才能工作。
尝试更新您的 ffmpeg 版本 运行 命令:
apt-get update ffmpeg
在您实例的控制台中。告诉我们进展如何。
const outFile = bucket.file(`${storagePath}`)
//create a referance to your storage bucket path
const outStream = outFile.createWriteStream()
您可以随时为您的 ffmpeg 命令设置一个 'stderr' 侦听器。 我在 google 应用程序引擎上遇到了类似的转码问题,所以流畅的 ffmpeg stderr 侦听器帮助我调试了很多。
ffmpeg.addInput(`tmp/${app_engine_filepath})
.format('mp3')
.on('stderr', function(stderrLine) {
console.log('Stderr output: ' + stderrLine);
})
.on('error, (error) => {
console.log(error)
})
.pipe(outStream)
.on('end', () => {
fs.remove(`tmp/${app_engine_filepath}`)
})
您可能还想在标准环境中检查您的 ffmpeg 版本。 (也应该可以通过 stderrlogs 查看)
折腾了半天,终于明白是怎么回事了。我没有足够的计算资源。如果有人要为图像和视频构建转码服务,请确保您将核心至少提升到 4 个。我的作业随机失败(但不能重复处理相同的文件)、网络套接字断开连接并重新连接等。
对于因为我没有 post 一个错误(我说我真的没有)而将我的问题降级的人......好吧,在当您的 CPU 由于跟不上负载而开始丢弃作业时记录。就像我在问题中提到的那样,我会收到错误但没有任何意义。