作为我项目的一部分,我有一个接收视频流的播放器。 我希望它在流开始和结束时自动播放和自动停止,所以我引入了一个检查以查看流是否处于活动状态并在每种情况下启动和/或停止播放器。
这是一个企业网站,有时会有多达 3000 名用户同时看到该流,我们对它进行了 15000 名同时用户的测试。
大多数用户使用此功能没有问题。然而,对于一小部分用户来说,流在传输的某个点错误地停止为完成。
这是一个 Angular FE,使用 Clappr 播放器。 AFAI 可以判断这种情况发生在 Windows 和 Chrome 中。
研究其中一个案例,我在控制台中发现了这个:
Uncaught (in promise) DOMException: The play() request was interrupted because
video-only background media was paused to save power.
https://developer.chrome.com/blog/play-request-was-interrupted/
这是一台装有 Chrome 的 Windows 机器。错误中存在的真实 url 是一个缩短的 url。我用完整的 url 代替,因为 SO 不允许发布缩短的 url。 所以我去了 Chrome 配置并找到了性能选项:Memory Saver 和 Energy Saver。我以为我找到了解决方案。很明显:这些配置之一可能会在用户更改选项卡并将流留在后台后停止流。
但那是我更大的问题开始的时候。首先,我试图找到可以执行此操作的确切选项。经过多次试验和错误后,我发现 Memory Saver 不会执行此操作,因为它在运行后会在返回页面时重新加载页面。在我的例子中,页面保持加载错误消息。
省电并没有停止播放视频。它删除了平滑滚动,可能还有其他内容,但没有阻止 AFAI 可以体验的视频。即使经过很长时间。
我打开了所有我能在 Windows 中找到的节能选项,但无法让它停止视频。
除此之外,错误消息中显示的 URL (https://developer.chrome.com/blog/play-request-was-interrupted/) 包含 2 个 AFAIU 无关错误的解决方案:
Uncaught (in promise) DOMException: The play() request was interrupted
by a call to pause().
和
Uncaught (in promise) DOMException: The play() request was interrupted
by a new load request.
这是由于无法访问流而暂停后尝试播放造成的。在我的例子中,暂停是为了省电(尽管我无法在所有省电选项都打开的情况下重现它)。 我什至在 Chromium 或 Clappr 的源代码中都找不到任何关于我在任何地方遇到的特定错误的参考。
所以现在我需要一种方法来真正重现显示该错误消息的错误。 那么问题是:真正导致特定错误消息的原因是什么?
我的应用程序本身并不能省电。但是我找不到任何生成该错误消息的省电选项。
在找到真正重现问题的方法后,我将需要找到避免视频停止的方法。因此,对这个问题的回答加分将是一种方法。
我只能在特定版本的 Chrome 和 Windows 中找到这两个选项(内存和节能模式):111.0.5563.148(官方版)64 位
没有任何具有此编号的 Chromium 版本。 Linux 中类似编号的 Chromium 版本没有这两个选项。此外,大多数 Chrome/Chromium 版本只有内存节省选项,而较新的版本则没有。我提到 Chromium 是因为谷歌出于安全原因不允许下载旧的 Chrome 版本,我们必须在需要时使用 Chromium。幸运的是,我有一个 Windows 副本,它与我发现问题的浏览器版本完全相同。 虽然我主要是放弃了这些选项作为原因,但我这样说是为了让有不同观点的人知道我可以测试它。
最后,我用于测试的流没有音频,以便复制可能产生错误的最佳条件。请记住,错误消息说“请求被中断,因为 video-only 后台媒体已暂停以节省电量”。
好吧,这个看起来不真实。在尝试各种配置、chromium 版本和设置一周后,我发现了如何重现错误:
确保播放器没有静音
将选项卡更改为背景 1 分钟后,应该会发生错误。打开或关闭节能和电池节省并不重要。 只需将播放器取消静音即可。
就是这样。耶稣......有时我讨厌我的职业:/