用于移动和 Web 的实时音频(无线电)流式传输的最佳协议是什么?

What's the best protocol for live audio (radio) streaming for mobile and web?

我正在尝试为互联网电台建立一个网站和移动应用程序(iOS、Android)。 网站用户广播他们的音乐或广播,而移动用户将只收听广播电台并与其他听众聊天。

我搜索了一个星期,并在Amazon EC2 上用Wowza 引擎(使用HLS 和RTMP)和SHOUTcast 服务器制作了一个原型。

使用HLS有5秒的延迟,RTMP和SHOUTcast有2秒的延迟。 有了这个结果,我想我应该选择 RTMP 或 SHOUTcast。

但我不确定 RTMP 和 SHOUTcast 是最好的协议。 :(

我应该选择什么协议? 我需要提供各种协议来覆盖所有平台吗?

直接流式传输 audio/mpeg(mp3 数据包)在我尝试过的任何地方都有效。

这是一个非常宽泛的问题。让我们从分发协议开始。

流媒体协议

HLS 的优势在于允许用户以最适合其连接的比特率获取流。客户端可以在不停止播放的情况下无缝缩放 up/down。这对于视频尤为重要,但对于音频,即使是移动客户端也能够在大多数地区播放 128kbit 流。如果您打算使用各种比特率并希望在中途更改质量,那么 HLS 是一个适合您的协议。

HLS 的缺点是兼容性。 iOS支持,仅此而已。 Android 支持 HLS,但仍有问题。 (也许再过一两年,一旦所有 Android 3.0 的人都离开了,这就不是什么大问题了。)JWPlayer 有一些技巧可以让桌面用户在 Flash 中使用 HLS。

除非您只关心 Flash 用户,否则我不会理会 RTMP。

使用 HTTP 的纯渐进式流媒体是我几乎总是选择的路线。 什么都能玩。 (甚至是 12 年前我的 Palm Pilot 的默认媒体播放器。)它易于实现且易于理解。

SHOUTcast 实际上是 HTTP,但实施不佳,存在兼容性问题,尤其是在移动设备上。它的响应中有一个非标准的状态行,这会破坏很多客户。 Icecast 是一个很好的选择,也是我今天推荐用于生产的选择。作为另一种选择,我创建了自己的流媒体服务,称为 AudioPump,它也是 HTTP,专门用于修复与古怪移动客户端的兼容性,例如旧硬件上的原生 Android 播放器。它还没有普遍可用,但如果你想试用,可以通过 brad@audiopump.co 与我联系。

延迟

您提到 2 秒的延迟是可取的。如果您使用 SHOUTcast 时出现 2 秒的延迟,则说明有问题。您 想要这么低的延迟,尤其是当您流式传输到移动客户端时。我通常从至少 20 秒的缓冲区开始,它会以最快的速度刷新到客户端。这允许立即开始流播放(因为它填满了客户端缓冲区,因此它可以开始解码),同时提供一些保护以防止由于网络条件导致的缓冲区欠载。移动用户在建筑物的拐角处走动而失去良好的信号质量的情况并不少见。你希望你的流尽可能地存活下来,所以如果你已经发送数据来弥补掉线,用户不必知道或关心他们的连接在短时间内变得平庸。

如果您确实需要低延迟,那么您完全看错了技术。对于低延迟,请查看 WebRTC。

您当然可以调整传统的网络广播设置以减少延迟,但这很少是个好主意。

编解码器

编解码器的选择最能决定您的兼容性。 MP3 无疑是最兼容的,AAC 也不甘落后。如果你使用 AAC,你会在给定的比特率下获得更好质量的音频。大多数人使用它来减少他们的带宽费用。

MP3 需要支付许可费,AAC 可能需要支付许可费,具体取决于您使用的编解码器。请咨询律师。我不是,而且许可极其复杂。

其他编解码器包括 Vorbis 和 Opus。如果您可以使用 Opus,那么请这样做,因为许可是完全开放的,并且您可以获得高质量的带宽。此处的客户端兼容性是 Opus 的杀手锏。 (也许几年后会更好。)Vorbis 是一个平庸的编解码器,但免费且清晰。

在极端情况下,我有一些电台使用 FLAC 进行流式传输。这是无损音频质量,但您需要为中等质量 MP3 站支付 8 倍的带宽。 FLAC over HTTP 流式传输兼容性目前不是代码,但它在 VLC 中工作正常。

流媒体支持多种编解码器是很常见的。根据您的预算,如果您做不到,最好使用 MP3。

最后关于编码,如果可以的话,不要从有损编解码器转到另一个有损编解码器。尝试使输出流尽可能接近输入。如果您重新编码音频,每次都会降低质量。

从浏览器录制

您提到用户通过浏览器流式传输。几年前我用 Web Audio API 构建了类似的东西,其中音频被捕获然后编码并发送到 Icecast/SHOUTcast 服务器。在这里查看:http://demo.audiopump.co:3000/ A brief explanation of how it works is here:

无论如何,我希望这能帮助你开始。

如果您正在开发一个 APP,那么使用 AAC,如果您只是通过网络浏览器播放,那么您需要一个 HTML5 实现,它是 MP3。所有自定义协议(如 RTMP 或 SHOUTcast)都需要额外构建 UI。开源世界中有一些第三方播放器可用。您可以使用它们或坚持使用 HTML5 MP3/OGG,因为现在大多数人都在使用 chrome 浏览器或其他 HTML5 投诉浏览器。