我们目前正在为我们的一个应用程序使用ExoPlayer,它与HQ Trivia应用程序非常相似,我们使用HLS作为流媒体协议。
由于游戏的性质,我们试图让这个流的所有观众都具有相同的延迟,基本上是为了使它们保持同步。
我们注意到,对于当前的后端配置,延迟大约介于6到10秒之间。基于这一事实,我们假设“强制”玩家以更大的延迟(15秒,更远离现场边缘)进行游戏是安全的,这样可以在所有设备上实现相同(恒定)的延迟。
我们使用EXT-X-PROGRAM-DATE-TIME标签来获取当前播放内容的服务器时间,我们还有一个带有当前时间(NTP)的主时钟。我们不断比较2个时钟来检查当前的延迟。我们暂停播放器直到达到所需的延迟,然后我们恢复播放。
该解决方案的问题在于延迟可能随着时间的推移而变得更糟(累积延迟),并且如果延迟变得太大(步长超过指定阈值),我们没有其他选择而不是重新开始重放并重做上述步骤。在重新启动播放器之前,我们还尝试稍微提高播放速度,直到达到指定的延迟。
exoPlayer实例使用DefaultLoadControl,DefaultRenderersFactory,DefaultTrackSelector进行设置,媒体源使用DefaultDataSourceFactory。
服务器端配置如下:cupertinoChunkDurationTarget:2000(默认值:10000)cupertinoMaxChunkCount:31(默认值:10)cupertinoPlaylistChunkCount:15(默认值:3)
我的第一个问题是,如果使用像HLS这样的协议甚至可以实现这一点?为什么玩家会越来越多地累积越来越多的延迟?考虑到我们的特定用例,是否有更好的exoPlayer实例设置?是否有更好的方法可以在所有播放设备上实现持续播放延迟?在尝试实现这种行为时,服务器端的参数有多重要?
我真的很感激任何帮助,因为我已经走到了尽头。 :)
谢谢!
唯一的解决方案是:
https://netinsight.net/product/sye/
它们的溶质包括帧精确同步,无漂移和有状态ABR。这可能无法通过基于http的协议来完成,因此它们的解析基于UDP传输。