有没有办法强制浏览器缓存已加载YouTube跨页面加载视频?
换句话说,如果你刷新某个视频页面,而该页面的视频已经开始加载(或已完全加载),播放器/浏览器就会开始重新下载整个视频,甚至使用相同分辨率时,而不是使用缓存中已有的版本。有没有办法改变这种行为?
以上情况是在使用 Flash 播放器和实验性HTML5播放器。
答案1
编辑:下面我所写的内容适用于 HTML5 版本(其中浏览器控制一切),在 Flash 版本中,Flash 设置可能也很重要。
不幸的是,特别是对于 YouTube 而言,情况非常复杂(也许其他视频网站上的情况更简单)。
首先,Firefox 缓存音频/视频文件时,这些about:config
设置可能会影响以下事项:
browser.cache.disk.enable
browser.cache.memory.enable
browser.cache.disk.capacity
browser.cache.disk.max_entry_size
browser.cache.memory.max_entry_size
您需要至少启用两种缓存中的一种,并设置适当的缓存大小,再加上足够高的max_entry_size
。最初,max_entry_size
不是很高,这是有道理的,因为您通常不想为了存储高清 VEVO 视频而清除一半的缓存。
好的,浏览器端没问题。下一步是服务器端缓存限制。我打开了随机的 YouTube 视频(用户上传的,不是受版权保护的内容,可能有所不同但尚未检查),以下是 FLV 文件的响应标头(使用 Fiddler 拍摄):
Cache-control: private
意味着文件可以在您的浏览器中缓存,但不能被任何中间缓存(例如 ISP 缓存)缓存如果
Expires
和max-age
均指定,max-age
胜利:14.9.3 基本过期机制的修改
如果响应同时包含 Expires 标头和 max-age 指令,则 max-age 指令将覆盖 Expires 标头,即使 Expires 标头的限制性更强
到目前为止一切顺利,max-age
这意味着我们可以在浏览器中本地缓存它约 6 小时。
但是让我们刷新页面或在新选项卡中加载它并比较 HTTP 请求列表:
http://o-o---preferred---sn-vg5obx-hgnl---v12---lscache5.c.youtube.com/videoplayback?upn=mY2b-T1WqcI&...
http://o-o---preferred---sn-vg5obx-hgnl---v12---lscache5.c.youtube.com/videoplayback?upn=U175csZ9oyw&...
YouTube 似乎添加了参数来跟踪播放次数、打击滥用(拥有不可预测的视频 URL)或其他什么的。
当在新选项卡中打开时,我有时甚至会看到不同的服务器被作为目标(工作中的负载均衡器):
http://o-o---preferred---sn-vg5obx-hgnl---v12---lscache5.c.youtube.com/videoplayback?..
http://o-o---preferred---sn-25g7rn7s---v12---nonxt5.c.youtube.com/videoplayback?..
基于Flash和基于HTML5的视频观看也是一样。
因为 URL 不同(即使只有一个字符),浏览器需要重新下载整个视频。
为什么每次都会针对不同的视频 URL?这是因为请求视频的 URL 如下:
http://www.youtube.com/watch?v=[[videoid]]
http://youtube.googleapis.com/v/[[videoid]]
有一个响应头
Cache-Control: no-cache
这意味着,浏览器根本不允许缓存此页面,每次需要向服务器发出请求时,服务器都会响应新的 200 OK 响应和用于查询视频的不同参数。
其他视频网站可能没有那么严格的限制,因此您可以在加载之间缓存视频。
--
在 IE8 中打开视频(大约 5 MB)时,我注意到了更有趣的事情。在 Firefox 中,整个视频作为一个流加载。在 IE8 中,它被发送为三个大约 1.7 MB 的块。也许是 IE 内部的某些问题,它无法很好地处理大文件。
--
如何启用缓存?
可以编写一个 Firefox 插件或 Fiddler 脚本,从 YouTube HTTP 响应中删除或替换与缓存相关的相应标头,以欺骗浏览器允许其执行的操作。然后,如果满足所有其他要求,浏览器将更积极地缓存并保持视频加载。