我正在开发使用HLS的iOS应用程序。在我们的视频平台中,当其中一个源不可用时,我们使用Nginx proxy_pass模块从一个源重定向到另一个源(我们有两个源)。源之间的切换对客户端来说是透明的,它由平衡器维护,因为客户端播放列表URI保持不变。
我们在AVPlayer中遇到了一个问题,这种切换工作流也出现在QuickTime中。根据网络日志,接下来的事情发生了:
在切换时,AVPlayer再次请求实时播放列表,当它完成播放切换前加载的块时,它开始播放播放列表中的下一个块,而是第一个!AVPlayer currentTime属性没有变化,它继续变化,就像没有切换第一个区块一样(在播放列表开始的正常搜索中,currentTime将为0),没有发生播放器项目状态变化,没有抛出通知,访问日志中没有任何特殊信息,错误日志完全为空。因此,我们无法更新用户界面(即搜索栏)并更改用户重定向到另一个直播时间。在我们不应该向用户显示超出特定广播范围的直播流的情况下,问题就更糟了。
如何解决这个问题有什么建议吗?还是它的核心AVPlayer错误(就这个问题也出现在Quicktime中而言)?
解决方案是:1) 为了对不同来源的播放列表使用不同的名称,2) 发送回客户端404,或者在尝试从禁用的源更新播放列表时发生另一错误,3) 在播放列表中使用回退-在多比特播放列表中从第二个来源添加第二个备用播放列表。HLS文件中有说明。当AVPlayer在更新播放列表时收到错误时,它会尝试从回退播放列表进行更新4) 为了提供手动质量选择,我们还必须在中间变体播放列表中用主播放列表和后备播放列表包装特定质量的播放列表。我们用来从直播中生成播放列表的FMS不能做到这一点,所以我们需要在Nginx 的一侧生成变体播放列表
其结果是容错视频平台,在主和从(第二)源之间进行透明切换,可进行自动和手动质量选择。