我正在使用一个向用户提供一些(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
。)
答案 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)。我在播放实况视频时使用相同的技术,当用户在暂停后按下播放时重新加载网址,强制播放器从实际的实时片段开始。