预加载HTML5视频可保持连接打开

时间:2017-01-31 11:22:03

标签: spring google-chrome spring-boot html5-video video.js

我正在使用一个向用户提供一些(html5兼容)视频的Web应用程序。我使用 videojs 来显示那些“预加载”属性设置为“自动”的视频。

我知道浏览器通常只加载一部分视频,这对我来说没问题。问题是它通过写入OutputStream来调度视频的后端(spring-boot)保持连接打开:

while ((read = input.read(buffer)) > 0) {
    output.write(buffer, 0, read); // once video is preloaded, it keeps waiting here
    output.flush();
}

1分钟后,如果用户没有按下播放按钮,则会抛出ClientAbortedException: java.net.SocketTimeoutException

预载完成后,有没有办法让浏览器关闭连接? (请注意,对于我们的系统,如果没有使用,请尽快关闭InputStream。)

1 个答案:

答案 0 :(得分:1)

是的,我同意。这是一个问题。

如果你正在使用播放列表和片段,例如HLS和DASH,那么下面的消息将起作用。

如果您正在播放静态文件(vod)并且其片段缓存在浏览器的缓存中,您可以使用设置超时功能重新启动播放器并再次重新加载所有设置,将preload属性替换为“none”,准备就绪事件。因此,您可以在几秒钟内控制缓存。

var stopcache = true;
// when ready, cache segments by 5 seconds and restart player
player.on('ready',function(){
    setTimeout(function() { 
      if (stopcache) {
        stopcache = false; // avoid repeat
        player.preload('none'); // or false if API allows
        player.autoplay(false);
        player.src('');
        player.src({
          type:'application/x-mpegURL',
          src:'//example.com/hls/stream.m3u8'
        });
      }
    }, 5000);
});
// avoid player reload if user played the file
player.on('play',function(){ stopcache = false; }); 

这只是一个消息,我没有尝试,但我相信它会起作用,因为播放列表和段被浏览器缓存(vod)。我在播放实况视频时使用相同的技术,当用户在暂停后按下播放时重新加载网址,强制播放器从实际的实时片段开始。