进行实时、可扩展音频处理的最佳策略


Best strategy for doing real time, scalable audio processing?

我正在构建一个web应用程序,允许用户上传音频文件,尤其是音乐。大多数时候,我预计每首歌的持续时间通常约为几分钟,文件大小约为3-10MB。然而,我想接受高达100MB的音频上传,可能允许一个多小时的音频。我目前正在使用FFmpeg、SoX和LAME的组合,将7种可能的格式转换为mp3,并执行音频修改,包括均衡、修剪和衰落。然后将这些文件存储并链接到数据库中。

我目前的策略是在后端使用PHP在一个HTTP文件上传请求中处理整个过程,其中我执行以下功能:

  1. 验证
  2. 将音频转换为多个版本(通过PHP使用shell)
  3. 将原始版本和转码版本存储在临时目录中
  4. 将所有音频文件上传到Amazon S3以进行永久存储
  5. 将每个文件的ID提交到数据库,并将其链接到用户

这与我已经建立的图像处理系统非常相似。然而,虽然图像可以在几秒钟内完成整个过程,但音频可能需要更长的时间。音频处理和存储最多可能需要5-10分钟。

我的问题是:

  1. 对于音频处理,将代码转换转移到另一个后台进程,将其状态写入数据库,并每隔几秒钟对其进行ping以更新网页,而不是在一个HTTP请求中完成所有操作,这会更好吗?

  2. 为了在未来进行扩展,是否建议在单个服务器实例上进行所有处理,让前端web实例可以自由复制/销毁?

    • 如果是,这是否需要跨域文件直接上传到该服务器?(有人知道youtube或大型网站是这样做的吗?)

谢谢!

如果我正确理解您的系统,您最好的方法可能更像这样:

  • 在web前端,存储音频并创建一个"任务",指示需要处理音频
  • 运行一个后台任务来提取任务并进行处理。在任务结束时,可以通知用户(如果需要),并且可以更新数据库状态或其他什么

应该编写任务,这样,如果任务中途失败,就可以从一开始就重新执行,而不会造成问题。您可以在此体系结构中运行多个后台任务和web前端。

编写任务的一个好方法是使用类似AMQP的消息传递系统。有一些像rabbitmq这样的廉价服务可以为您做到这一点。当然,您也可以在任何数据库上构建自己的数据库,但这可能需要轮询。

最后,您可能会发现使用zencoder这样的服务来进行代码转换更快、更高效,因为它们可以并行化工作,并且可能处理更多的输入格式,但可能与您的处理不兼容。

您肯定希望将音频处理抛给后台进程。

根据所涉及的可扩展性,您可能需要一台专门用于处理的计算机。你可能想研究一下其他可以卸载音频的资源(比如PCIe卡等)

很抱歉,我对跨域文件上传一无所知,也不知道大狗是如何上传的(youtube,soundcloud等等)