2017-01-31 6 views
0

Я работаю в веб-приложении, которое предоставляет пользователю (html5-совместимые) видео. Я использую videojs, чтобы показать эти видео с «preload» атрибут, установленный в «auto».Предварительная загрузка видео в формате HTML5 открывает соединение

Я знаю, что браузеры обычно загружают часть видео, и это нормально для меня. Проблема заключается в том, что он держит связь открыта с бэкэнд (весна-загрузкой), который отправляющее видео записи в OutputStream:

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

Да, я согласен. Это проблема.

Приведенный ниже текст будет действовать только в том случае, если вы используете плейлист и сегменты, такие как HLS и DASH.

Если вы играете в статические файлы (vod), а его сегменты кэшируются в кеше браузера, вы можете перезагрузить плеер с помощью функции тайм-аута набора и снова перезагрузить все настройки, заменив атрибут предварительной загрузки «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). Я использую ту же технику при воспроизведении видео в реальном времени, перезагружая URL-адрес, когда пользователь нажимает кнопку воспроизведения после паузы, заставляя игрока начинаться с реального живого сегмента.

+0

Мы не используем плейлист, но ваше решение дало мне некоторое представление. Благодарю. – Ivan