如何将音频文件流式传输到 EC2 实例上的 Icecast 服务器 运行?

How do I stream audio files to my Icecast server running on an EC2 instance?

我正在尝试从我的 Icecast 服务器 24/7 循环播放音频。

我见过一些例子,人们谈论将他们的音频文件存储在 EC2 实例或 S3 存储桶中。

我的 EC2 实例上是否还需要源客户端 运行 才能将音频流式传输到服务器?或者有没有办法从 Icecast 播放静态文件?

Icecast 和 SHOUTcast 服务器通过将实时音频流从源传递给用户来工作。您需要一些东西来从这些源文件实时生成单个音频流。

流程看起来像这样:

基本上,您需要做所有在普通广播工作室中会做的事情,但是是自动化的。您将从存储桶中流式传输文件,将它们播放为原始音频流,将该流发送到编码器以使用编解码器压缩,然后发送到流式传输服务器进行分发。

您不能简单地将音频文件 as-is 推送到 Icecast 服务器,原因如下:

  • 流必须是实时的
    服务器并不真正知道或关心流的时间。它获取给定的数据并将其发送给客户端。因此,如果您以比实时更快的速度推送数据,服务器将尝试以更快的速度将其交付给客户端。一些客户端会尝试缓冲这个快速流,但大多数会对流施加背压,导致 TCP window 关闭,导致客户端最终落后到服务器断开连接的程度。

  • 需要一致的格式
    很有可能,您的源文件具有不同的采样率、通道数,甚至编解码器。大多数客户端无法更改采样率或通道数 mid-stream。我不知道有任何客户端支持编解码器更改 mid-stream。 (理论上 Ogg 和 Matroska/WebM 是可行的,但是是的......不值得一试。)

  • Stream 应该没有 ID3 标签和其他文件格式的垃圾
    如果您只是将文件直接 PUT 到您的 Icecast 服务器,输出流将包含的不仅仅是音频数据。至少,您想要删除所有这些。根据您的容器格式,您还需要处理时间戳。

解决方案

有几种方法可以解决这个问题:

  • 无线电自动化软件
    许多人只是在 cloud-based 服务器上 运行 类似 RadioDJ 的东西.如果您已经有一个使用自动化的广播电台,这可能是一个很好的解决方案。虽然它可能很昂贵,而且不那么灵活。你甚至可以低至 VLC 或其他播放器,但那样你就不会有音乐过渡等等。

  • 自定义播放脚本(推荐)
    我使用浏览器引擎,例如 Chromium,并使用正常 JavaScript.从那里,我获取输出流并将其传递给 FFmpeg 进行编码并发送到流媒体服务器。这非常有效,因为我可以用大家都知道的语言完成我的所有工作,而且我可以轻松访问 cloud-hosted 服务上的数据。我可以使用网络音频 API 根据实时发生的情况混合和混合音频。作为替代,有 Liquidsoap,但我现在不推荐它,因为它的语言很难处理,而且不像浏览器引擎那样灵活。