在chromecast内存中存储大文件

时间:2014-07-28 19:55:46

标签: javascript html5 video browser-cache chromecast

问题

我制作了一个接收器应用程序,它只是在Chromecast上循环显示视频。问题是Chromecast似乎没有在其缓存中缓存视频。因此,视频每次完成循环时都会下载,并且需要大量带宽。该视频将托管在外部服务器上,因此Chromecast每次都必须从互联网上下载(我无法更改该规格)。

正如您所知,在桌面Chrome应用程序上调试接收器应用程序时,视频会被浏览器缓存,因此问题似乎不是来自缓存行为的http响应。

我探索的解决方案

我尝试在ajax中下载视频文件并播放它。问题是,当我的Javascript尝试读取responseText的{​​{1}}字段时,当结果超过28MB(我尝试使用50MB文件(崩溃)和28MB文件时)Chromecast似乎崩溃(它没有崩溃),限制实际上可能是32MB)。

编辑: 我也试过了this example,它也让chromecast崩溃......

问题

是否可以在Chromecast上缓存50-100MB的视频,并防止它每次都下载或者是否存在我将该视频存储在Chromecast内存中的记忆技巧?每个应用程序使用一次加载视频将是我减少带宽使用的目标结果。

3 个答案:

答案 0 :(得分:4)

我对这个答案有点不确定,因为我发现它有点太明显了。但我会试一试:

你说你通过ajax下载28MB的设置没问题。你为什么不进一步削减它?例如,您可以使用4MB。我建议这样做是因为它可以减轻因计算“爆发”而引起的问题,例如你在阅读responseText对象的xhr字段时所提到的。

在确定了合适的块大小后,您可以使用http://tools.ietf.org/html/draft-ietf-httpbis-p5-range-22#section-3下载部分视频,然后根据需要在javascript中连接它。另请参阅Download file in chunks in Chrome Javascript API?

如果您有权访问服务器,您还可以在服务器端拆分文件,以便您可以从客户端发送请求,如下所示:

example.com/movies/my_movie.mp4?chunk=1

答案 1 :(得分:2)

尝试使用Application Cache manifest file确保文件只下载一次:

class Foo < ActiveRecord::Base
  DAYS_TILL_OLD = 7.days

  scope :recent, -> { where "created_at > ?", DateTime.now - DAYS_TILL_OLD  }
end

其中<html manifest="some.manifest"> 的内容为:

some.manifest

这将确保将来对资源的HTTP请求不会导致下载。视频将仅在清单文件更改时重新下载(因此您可以更改CACHE MANIFEST # version 1.0 the_video_to_cache.webm - 带前缀的注释字符串以重新下载)。请注意,在下载完成之后,新版本将显示在首页加载上。更新后,用户将看到一次过时的视频(新版本下载),然后在下次访问时看到新版本。

请注意,如果您的视频大于应用缓存的允许大小,则可能无法使用此功能。

答案 2 :(得分:0)

我没有Chromecast,也不确定。是否可以使用Quota Management API等实验性功能?这个API可以为你存储的数据添加一些额外的内存,也许你应该尝试使用它。