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

Posted

技术标签:

【中文标题】停止缓冲 HTML5 视频,但保留缓冲数据。然后继续【英文标题】:Stop buffering HTML5 video, but preserve buffered data. And then resume 【发布时间】:2015-04-03 15:44:31 【问题描述】:

我正在从事一个可以在两个或多个视频之间切换的项目。

所以如果 Video-A 正在播放并且我切换到 Video-B 我希望能够停止缓冲 Video-A,开始缓冲并播放 Video-B。然后,如果您想返回 Video-B,请停止 B 并恢复 A,而无需重新开始缓冲。

我想防止应用程序必须一次缓冲多个视频以节省带宽。

到目前为止,我找到的唯一解决方案是删除视频的来源并重新放置。

video.src = ""

我不喜欢这个解决方案。我希望在 Video API 中提供此功能,例如:

video.stopBuffering()
vide.resumeBuffering()

但似乎并非如此。有任何想法吗?

【问题讨论】:

【参考方案1】:

简答:做不到。

没有 API 公开方法可以做到这一点,并且几乎完全取决于浏览器如何处理实际的加载/缓冲策略(有一些定义的步骤,但策略没有)。

standard中定义的一些内部结构:

下载速率可能[也]由 用户代理,例如平衡下载与其他连接 共享相同的带宽。

用户代理可能随时决定不下载更多内容,例如 在缓冲一小时媒体资源的五分钟后,而 等待用户决定是否播放资源, 在交互式资源中等待用户输入时 [...]

用户代理可以使用任何必要的方式来获取资源 (在本规范和其他规范提出的限制范围内); 例如,面对网络错误重新连接到服务器, 使用 HTTP 范围检索请求,或切换到流式传输 协议。用户代理必须认为资源错误只有当它 已放弃尝试获取它。

您可以随时暂停视频。这可能会使浏览器在几秒钟后暂停下载数据,但同样,这取决于浏览器如何实际处理。

所以,总而言之:不管我们喜不喜欢,它就是这样。

【讨论】:

我希望你是对的,但浏览器会继续缓冲两个视频,即使其中一个或两个都暂停! @limoragni 是的,我声明“完全由浏览器来处理加载/缓冲策略。”。使用 pause() 是你唯一的影响选择(如果有的话)【参考方案2】:

媒体preload 属性对探索很有用,尽管它仅适用于in some browsers。

html5 规范似乎预测了您的确切用例: http://www.w3.org/TR/html5/embedded-content-0.html#attr-media-preload

注意:作者可能会将属性从“无”或“元数据”切换为“自动” 一旦用户开始播放动态。例如,在一个页面上 许多视频这可能用于表明许多视频是 除非有要求,否则不得下载,但一旦被要求下载 要积极下载。

【讨论】:

我一定会调查的。我知道“预加载”属性,但我认为它只会在播放某些视频之前有用。如果动态更改该属性会阻止视频被缓冲,这将是可行的方法。我会让你知道我发现了什么。谢谢! 这样不行。切换预加载属性对维护缓冲区不起作用。它仅在应用程序启动时有用。一旦你点击播放,你就不能停止缓冲。到目前为止,唯一的方法是删除 src 属性,我发现这是一种非常糟糕的方法。 感谢您跟进您的评论。我怀疑可能是这种情况,但我在上面发布的说明让我希望它可能在某些浏览器中工作。在任何一种情况下,调整预加载设置都将有助于减少包含多个视频元素的页面的带宽需求 - 只是没有您希望的那么智能。

以上是关于停止缓冲 HTML5 视频,但保留缓冲数据。然后继续的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 视频:强制中止缓冲

HLS 流 HTML5 视频 - 缓冲 X 时间后刷新

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

HTML 5 视频,流式传输/缓冲较长视频的特定部分

如何停止 HTML5 视频?

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