将ffmpeg中的视频文件直接输出到谷歌云存储

Posted

技术标签:

【中文标题】将ffmpeg中的视频文件直接输出到谷歌云存储【英文标题】:Output a video file from ffmpeg directly to google cloud storage 【发布时间】:2021-09-07 19:07:47 【问题描述】:

问题的背景

我们正在尝试使用托管在 Google App Engine (GAE) 中的服务器中的 FFmpeg 压缩视频。输入文件在谷歌云存储(GCS)中,可以很容易地作为输入传递给 FFmpeg 并完成处理,但是,我想直接将文件输出到 GCS。我在这里参考了https://ffmpeg.org/ffmpeg-protocols.html#http 的文档,他们提供并使用了正确的标题和方法来使用签名的 URL 上传文件,但它似乎不起作用。到目前为止,我什至不确定这是否可能。

当前实施

目前,我们首先将输出文件保存在 GAE 工作区中,然后将文件上传到存储桶。在我们遇到另一个问题之前,这个流程运行良好。每当文件太大时,处理时间超过 10 分钟,这似乎是灵活环境中自动缩放实例的阈值。为了解决这个问题,我们可以在标准环境中使用 basic_scaling,但我们似乎无法在 GAE 工作区中写入文件。我可以选择写入/tmp 目录,但它使用 RAM,而且我们可以一次上传许多文件,所以这不是一个选项。

可能的未来

目前我看到的一种解决方案是使用具有手动扩展功能的灵活环境,但在扩展和成本效益方面这是一个坏主意。另一个我不太确定的方法是使用 Google Compute Engine,但我还没有尝试过。

结论

由于无法从 FFmpeg 向 Google Cloud Storage 发出 PUT 请求,导致我遇到了围绕 GAE 及其奇怪的实例和功能集组合的数十个问题。

如果我遗漏任何东西,我将非常感谢您的建议或可能的解决方案。如果我们能让 FFmpeg 将文件输出到 GCS 就好了。

【问题讨论】:

【参考方案1】:

如果您选择使用 Compute Engine。有很多选项可供您选择,具体取决于您选择的编程语言。

您可以从 NodeJS 将内容上传到 Google Storage,也可以使用 NodeJS 的 FFMpeg 库。他们都没有实际保存文件。直接从输入文件管道/流式传输到 Google Cloud Storage。

更多信息:

Node.js 的 FFmpeg 模块。这个库提供了一组函数和实用程序来抽象 ffmpeg 的命令行使用。要使用这个库,需要已经安装了 ffmpeg(包括所有必要的编码库,如 libmp3lame 或 libx264)

https://www.npmjs.com/package/ffmpeg

createWriteStream(optionsopt) → WritableStream 创建一个可写流以覆盖存储桶中文件的内容。

https://www.npmjs.com/package/@google-cloud/storage

【讨论】:

感谢领导,我会进一步调查。需要说明的是,如果 node js 的 FFMpeg 库支持直接流式输出到 GCS,那么只使用 GAE 就足够了,我们不必切换到 Compute Engine,对吗? 不确定是否可以在 GAE 上安装 ffmpeg 模块。试试看

以上是关于将ffmpeg中的视频文件直接输出到谷歌云存储的主要内容,如果未能解决你的问题,请参考以下文章

如何从应用引擎将写入附加到谷歌云存储文件?

如何将数据附加到谷歌云存储上的文件

将文件从 AWS s3 (SSE) 存储桶复制到谷歌云

如何使用签名的 URL 将文件上传到谷歌云存储桶

将缓冲区上传到谷歌云存储

使用 ajax 通过签名的 url 将文件上传到谷歌云存储