2017-01-31 3 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와 같은 재생 목록과 세그먼트를 사용하는 경우에만 아래의 Sugestion이 작동합니다.

정적 파일 (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; }); 

이 그냥 sugestion, 나는 그것을 시도하지 않았다 그러나 나는 재생 목록 및 세그먼트 브라우저 (VOD)에 의해 캐시 있기 때문에 작동 할 것이라고 생각합니다. 라이브 비디오를 재생할 때도 동일한 기술을 사용합니다. 일시 중지 후 사용자가 재생을 누르면 URL이 다시로드되어 실제 라이브 세그먼트에서 시작됩니다.

+0

우리는 재생 목록을 사용하지 않지만 귀하의 솔루션은 나에게 약간의 통찰력을주었습니다. 감사. – Ivan