在 offline/disconnected 时继续流式传输音频几分钟?

Continue streaming audio when offline/disconnected for a few minutes?

我找了几天了,好像没找到解决办法。我希望这里有人能给我指出正确的方向。

我正在使用 Cordova/Angular 构建一个收音机 iOS 应用程序,并且我有一个正在播放的 mp3 流 (http://mp3lg3.tdf-cdn.com/5593/goo_102004.mp3) HTML5。

我想找到一种即使设备失去连接几分钟也能继续流式传输的方法,如果连接 returns,继续正常流式传输。目前,如果我关闭 wifi,或打开我的设备 'Airplane Mode',它会立即停止流。

我对音频世界还很陌生,希望有经验的人能提供帮助。

HTTP 渐进式流式传输的工作原理是简单地在一个连续的流中发送数据,而接收端在数据传入时播放数据。网络的本质是数据以块的形式出现,而不是连续的,所以客户端播放后面的音频有几秒钟的缓冲区,可以在周期性的数据突发中幸存下来。

为了在一分钟的丢失中存活下来,客户端将不得不在未来接收超过一分钟的数据。这是通过在服务器上缓冲一分钟的数据然后在连接时尽快将该缓冲区刷新到客户端来实现的。虽然它不会同时到达客户端,但它应该相当快地到达那里,然后您将拥有可以在断开连接后仍然存在的缓冲区。也就是说,如果您的服务器比客户端提前一分钟,而具有完整 1 分钟缓冲区的客户端失去连接,它可以继续播放大约一分钟,然后才退出。

但这只是问题的一半。当你重新连接时你会做什么?客户端如何同步到服务器?不幸的是,没有 public 支持同步方式的实时 HTTP 渐进式服务器。我自己用 Range headers 做了一些试验,哪些不起作用,但需要自定义客户端。 (但是 VLC 确实有效...)

您还必须考虑音频立即停止的原因。如果您试图通过打开飞行模式来模拟网络中断或慢点,那么这不是一个合适的测试。 OS 禁用网络接口,它会立即丢弃任何 TCP 连接,立即终止到应用程序的管道。大多数应用程序将在此时停止播放,除非它们有一些额外的缓冲区,而不管网络连接如何。在您的网络连接质量受到影响的情况下,TCP 连接实际上很少被丢弃...数据包只是延迟导致音频最终在缓冲区用完时停止。

综上所述,根据您的需要,有两种解决方案:

在网络质量变化的情况下存活,TCP 连接存活

这很简单。增加刷新到客户端的 server-side 缓冲区。我一般用20秒。

请注意,并非所有客户端都会接受这么大的缓冲区。有些会降低 TCP window 大小,防止服务器发送过多的音频数据。

(注意:如果您不知道如何使用现有的流媒体服务器执行此操作,buffer configuration is available on the AudioPump CDN 我已经创建了它。它还没有普遍可用,但是您e-mail 我在 brad@audiopump.co 可以试试吗。)

在 IP 地址更改后仍然存在,TCP 连接肯定会丢失

对于这种情况,您需要一个全新的流媒体协议。 HLS就是你想要的。

HLS 的工作原理是将您的流进行分段,无论如何都必须通过多个 HTTP 请求进行请求。因此,客户端可以更改地址(例如从移动网络转到 WiFi)并且流仍然有效。

不幸的是,

HLS 不受客户支持,但 server-side 很容易。在大多数情况下,任何 HTTP 服务器都可以。编码器是需要更改的部分,用于编码和上传片段。

如果是没有直播内容的普通流,也许您可​​以将其转换为字节数组(2 倍速),然后以正常速度播放。虽然有点复杂。