HTML5 视频缓冲,尽管等待 `canplaythrough` 事件到 `play()`

Posted

技术标签:

【中文标题】HTML5 视频缓冲,尽管等待 `canplaythrough` 事件到 `play()`【英文标题】:HTML5 video buffering despite waiting for `canplaythrough` event to `play()` 【发布时间】:2020-09-08 03:56:00 【问题描述】:

我试图确保(尽可能)html5 视频只有在它能够完全播放而无需缓冲时才开始播放。对于上下文,视频的 MediaStream 然后用于与另一个音频源混合并通过对等 WebRTC 连接发送。视频通常为 5-10MB,时长为几分钟(即良好的宽带连接应该可以在播放完成之前轻松加载整个视频)。

为了实现这一点,我的代码当前等待视频元素上的canplaythrough 事件开始并在它触发时调用play()

从视频开始播放的意义上说,这种“有效”,在大多数情况下,缓冲足以让视频不间断地播放。但是,在少数情况下(特别是到目前为止,两个人都在 MacBook Airs 上运行 Chrome 并且显然不是令人难以置信但不错的宽带互联网连接)视频播放交错且断断续续——我认为这意味着视频缓冲不足。

是否有更好的技术可以确保视频在大多数浏览器上得到充分缓冲?

使用fetch() 缓冲内存中的整个视频可能会奏效吗?还是生成的blob() 实际上也在幕后懒惰地缓冲?

鉴于我无法真正在本地复制这些问题,是否有测试和调试此类问题的良好做法?

【问题讨论】:

【参考方案1】:

我已经构建了一个名为Stream or Not 的工具,它可能对网络端有所帮助。它会告诉您视频需要多长时间才能开始播放、停顿了多少等。您可以使用浏览器的 devTools 来限制网络(在 Chrome 中,您可以模拟 CPU)。

老实说 - 看看是不是网络问题,只要比特率(使用 FFprobe https://www.streamclarity.com/probe?url=)低于网络速度,你就没有网络受限。

还有另一种可能。您的视频尺寸是多少?浏览器上视口的尺寸是多少?如果您要求设备减少大量像素 - 播放限制可能会从带宽转移到 CPU 处理速度。我在mobile devices 和尝试播放 4k 视频的旧 Mac 上看到过这种情况 - 只是没有足够的 CPU 来处理这么多像素。

    为了确定,我会测试网络速度。 确保您发送的像素没有超出您的需要。功率不足的设备会出现问题。

【讨论】:

以上是关于HTML5 视频缓冲,尽管等待 `canplaythrough` 事件到 `play()`的主要内容,如果未能解决你的问题,请参考以下文章

仅在缓冲完整视频后才开始播放 HTML5 视频

HTML5 视频:强制中止缓冲

停止缓冲 HTML5 视频,但保留缓冲数据。然后继续

Youtube 的 HTML5 视频播放器如何控制缓冲?

HTML5 视频卡顿/运行不流畅/缓冲和预加载

有没有办法知道 HTML5 视频初始缓冲区百分比的 Javascript 百分比?