如何为 HTML <video> 标签缓存 mp4 视频?

Posted

技术标签:

【中文标题】如何为 HTML <video> 标签缓存 mp4 视频?【英文标题】:How to cache mp4 video for the HTML <video> tag? 【发布时间】:2019-02-12 16:45:57 【问题描述】:

我们有一个带有整页背景 mp4 视频 (9MB) 的 aspx 页面,类似于:

https://www.w3schools.com/howto/howto_css_fullscreen_video.asp

虽然我们注意到在 iPad 和 iPhone 上每次用户导航回页面时它都开始重新下载视频文件,但它可以正常工作。

我们期望 ios Safari 和 Chrome 会从浏览器缓存中获取它,这样用户就不必使用更多带宽。

有没有办法强制缓存?

【问题讨论】:

为 mp4 设置了哪些响应标头?它有任何与缓存相关的标头吗? @Ogge 道歉,但我之前没有使用响应头的经验,所以这对我来说是新的。基本上我们有一个类似于示例的新 aspx webform 页面。如果你的意思是在那个特定的 aspx 页面中放一些东西,我很想知道你的意思。 您可以通过设置不同的响应标头来控制项目的缓存方式,通常您在 web.config 中执行此操作。在 aspx 文件中很难做到。 【参考方案1】:

我不得不处理类似的问题。 事实证明,当通过 video src 属性调用相同的 URL 时,Safari iOS/Desktop 仍然无法从缓存中提取视频。

我找到的解决方法是使用 js fetch API 下载完整视频,然后将其流式传输到视频标签中。如果您只提供小视频,这可能是一个很好的解决方案,因为使用这种方法您无法在下载完整数据之前开始播放视频。

const videoRequest = fetch("/path/to/video.mp4")
    .then(response => response.blob());

videoRequest.then(blob => 
    video.src = window.URL.createObjectURL(blob);
); 

与 video src 属性相反,如果之前已经提取过相同的视频,则 fetch API 将从缓存中获取视频数据。

这是一个codepen demo,可以在 Safari 桌面/移动设备上进行测试(当不在私人模式下时)。

我开了一个类似的问题here

【讨论】:

如果它仅适用于 Safari,您是否考虑过浏览器嗅探仅将该代码提供给 Safari 浏览器? @user1946932 是的,当然,我是在服务器端做的,但也有很多库供前端使用。

以上是关于如何为 HTML <video> 标签缓存 mp4 视频?的主要内容,如果未能解决你的问题,请参考以下文章

关于HTML5中video标签的奇怪现象

jQuery如何为指定标签添加和删除一个样式

如何为动态生成的<a>标签添加事件 ,只有点击时触发?

如何为一个li标签添加图片符号?

如何为 p 标签中的星号第一个字符着色

如何为 <noscript> 标签编写自动化测试?