我已经搜索了几天,我似乎无法找到解决方案。我希望有人能指出我正确的方向。
我正在使用Cordova / Angular构建一个无线电iOS应用程序,我有一个mp3流(http://mp3lg3.tdf-cdn.com/5593/goo_102004.mp3),我正在玩HTML5。
我想找到一种方法来继续流,即使设备丢失连接几分钟,如果连接返回,则继续正常流式传输。目前,如果我关闭wifi,或打开我的设备'飞机模式',它会立即停止流。
我对音频界很陌生,希望有经验的人可以提供帮助。
答案 0 :(得分:1)
HTTP渐进式流式传输通过简单地在一个连续流中发送数据来工作,而接收端在数据进入时回放数据。网络的本质是数据是块状的,而不是连续的,所以客户端播放数据音频具有几秒钟的缓冲区,可以在周期性的数据突发中存活下来。
为了在一分钟内辍学,客户将来必须收到超过一分钟的数据。这是通过在服务器上缓冲一分钟数据然后在连接时尽快将该缓冲区刷新到客户端来实现的。虽然它不会同时到达客户端,但它应该合理地快速到达那里,然后你将拥有可以在断开连接时存活的缓冲区。也就是说,如果您的服务器比客户端提前一分钟,并且具有完整1分钟缓冲区的客户端失去连接,它可以继续播放大约一分钟,然后再退出。
这只是问题的一半。重新连接后你会怎么做?客户端如何与服务器同步?不幸的是,没有公共服务器执行支持同步方式的实时HTTP渐进式。我已经完成了一些使用Range
标题进行自我实验的方法以及哪些标题不起作用,但需要自定义客户端。 (VLC确实有效......)
您还必须考虑音频立即停止的原因。如果您尝试通过启用飞行模式来模拟网络丢失或慢点,则这不是一个合适的测试。操作系统禁用网络接口,立即丢弃任何TCP连接,立即终止管道到应用程序。大多数应用程序将在此时停止播放,除非它们具有一些额外的缓冲区,无论网络连接如何。在您的网络连接质量受损的情况下,很少有TCP连接实际丢失...数据包只是被延迟导致音频最终因缓冲区用完而停止。
尽管如此,根据您的需求,有两种解决方案:
这很简单。增加刷新到客户端的服务器端缓冲区。我通常使用20秒。
请注意,并非所有客户端都会接受这么大的缓冲区。有些会降低TCP窗口大小,阻止服务器发送过多的音频数据。
(注意:如果您无法弄清楚如何使用我已创建的现有流式传输服务器buffer configuration is available on the AudioPump CDN来解决此问题。目前尚未提供,但您可以发送电子邮件我在brad@audiopump.co尝试一下。)
对于这种情况,您需要一个全新的流媒体协议。 HLS就是你想要的。
HLS的工作原理是对您的流进行分段,无论如何必须由多个HTTP请求请求。因此,客户端可以更改地址(例如从移动网络到WiFi),并且流仍然可以工作。
很遗憾,HLS不受客户端的支持,但服务器端很容易。在大多数情况下,任何HTTP服务器都可以。编码器需要更改,编码和上传段。
答案 1 :(得分:1)
如果它是没有实况内容的普通流,也许您可以将其转换为字节数组(2倍速),并以正常速度播放。虽然有点复杂。