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(系统包)。

下面是伪代码...第三步是问题所在。

  1. 将文件名发送到 GAE 端点
  2. 将文件从 google 云存储下载到临时文件
  3. 使用 ffmpeg 转码
  4. 将临时文件上传到 google 云存储
  5. 删除旧的 google 云存储文件
  6. 删除临时文件

我用来测试的文件是 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 由于跟不上负载而开始丢弃作业时记录。就像我在问题中提到的那样,我会收到错误但没有任何意义。