I.K.Picture & IT Info.

[spring boot] 비디오 스트리밍 방법 본문

Development/Java/Android

[spring boot] 비디오 스트리밍 방법

helpful-intruder 2021. 3. 24. 01:01
반응형

웹 서비스 구축 시 간단히 비디오를 보여줘야될 때가 있습니다. 

물론 다운로드 형태로 처리를 하면 바로 처리가 되긴 합니다...

 

하지만 용량이 큰 영상의 경우

다운로드 하면서 바로 보기가 쉽지 않고 중간 재생도 어렵습니다.

 

자바 기반 웹 어플리케이션을 만들 때 

스트리밍 형태로 제공할 수 있는 간단한 소스코드 하나를 공유하려고 합니다. 

@GetMapping(value="/mp4Stream")
public void viewMp4Stream (@RequestParam String path,
                                                      HttpServletRequest request , HttpServletResponse response)throws IOException { 
    File file = service.getFile(path); 
    RandomAccessFile randomFile = new RandomAccessFile(file, "r"); 
    long rangeStart = 0; //요청 범위의 시작 위치 
    long rangeEnd = 0; //요청 범위의 끝 위치 
    boolean isPart=false; //부분 요청일 경우 true, 전체 요청의 경우 false 
    try{ //동영상 파일 크기 
        long movieSize = randomFile.length(); //스트림 요청 범위, request의 헤더에서 range를 읽는다. 
        String range = request.getHeader("range"); 
        if(range!=null) { 
              if (range.endsWith("-")) { 
                   range = range + (movieSize - 1); 
              } 
              int idxm = range.trim().indexOf("-"); 
              rangeStart = Long.parseLong(range.substring(6, idxm)); 
              rangeEnd = Long.parseLong(range.substring(idxm + 1)); 
              if (rangeStart > 0) {
                  sPart = true; 
              }
        }
        else {
 
            rangeStart =0; 
            rangeEnd = movieSize -1; 
        } 
        long partSize = rangeEnd - rangeStart + 1; 
        response.reset(); 
        response.setStatus(isPart ? 206 : 200); 
        response.setContentType("video/mp4"); 
        response.setHeader("Content-Range", "bytes "+rangeStart+"-"+rangeEnd+"/"+movieSize); 
        response.setHeader("Accept-Ranges", "bytes"); 
        response.setHeader("Content-Length", ""+partSize); 
        OutputStream out = response.getOutputStream(); 
        randomFile.seek(rangeStart); 
        int bufferSize = 8*1024; 
        byte[] buf = new byte[bufferSize]; 
        do{ 
            int block = partSize > bufferSize ? bufferSize : (int)partSize; 
            int len = randomFile.read(buf, 0, block); 
            out.write(buf, 0, len); 
            partSize -= block; 
        }while(partSize > 0); 
    }catch(IOException e){ 
    }finally{ 
        randomFile.close(); 
    }
}

 

소스 코드에 간단한 주석을 달아놓았어요.

setContentType에 mp4로 되어있는데 제가 확인한 결과 mov 파일 등 

스트리밍 서비스가 되는 것을 확인하였어요

 

필요하신 분은 복사하셔서 쓰시고 

혹시 질문 있으신 분들은 댓글 남기시면 제가 확인하는데로 답변드릴께요

 

반응형
Comments