pousees
439
2021-07-27 16:25:59
4
101

mp4 영상을 스트리밍 하는데, 재생시간 변경이 안됩니다.


https://okky.kr/article/1006874?note=2443704


이 글을 썻었는데,

그냥 로컬톰캣에 올려서, 

http://localhost:8080/sample/resources/video/test.mp4

이렇게 영상을 재생시켜봤는데,


이 상태에서도 재생시간의 변경이 안되더군요;;;

혹시 스트리밍 서버 환경을 제가 잘못 구축한걸까요??;;


그리고 한번씩

GET http://localhost:8080/sample/resources/video/test.mp4 net::ERR_CONTENT_LENGTH_MISMATCH 200


이런 에러가 발생하던데, 이게 혹시 원인이 아닌가 의심하고는 있는데

도무지 해결방법을 못찾고 있습니다.


혹시라도 뭐든 좋으니 조언좀 부탁드립니다 _ _)


0
  • 답변 4

  • ghkdwls30
    2k
    2021-07-27 16:34:19

    Range Request를 이해하시면됩니다..


    https://developer.mozilla.org/ko/docs/Web/HTTP/Range_requests

  • pousees
    439
    2021-07-27 16:49:28

    ghkdwls30 감사합니다.

    일단 자료 내용은 확인하긴 했는데...

    그럼 코드상에 문제가 아닌, 서버에 문제라는거 같은데...

    톰캣 서버설정을 바꿔줘야 하는걸까요?;;;

  • ghkdwls30
    2k
    2021-07-27 17:02:42 작성 2021-07-27 17:03:53 수정됨

    아실줄알았는데 잘모르시는것 같으니 아주쉽게 설명드리지요


    보통 안드로이드 같은 경우는 자기가 알아서 처리합니다. 통 미디어를 받아서 지가 처리하죠

    그러나 IOS같은 경우 range 리퀘스트를 날립니다. 

    다른 플랫폼들도 range리퀘스트에 대해서는 range로 응답해야합니다.


    range요청은 vedio 태그쓰셧으면 알아서 range로 요청할거에요 

    requet header 헤더까보세요. 


    video 태그가 range 요청을 했지만 서버에서는 통 미디어를 반환하니까 재생시간 변경못하는겁니다.


    따라서 서버에서 파일을 내려줄때  코드변경이 필요한것이지요.. 

    옛날에 제가 만든 소스 첨부합니다..


     if (request.getHeader("Range") != null) {
    
    			response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
    			String rangeValue = request.getHeader("range").trim().substring("bytes=".length());
    			File fileloc = cmFileDetailVO.getFile();
    			long fileLength = fileloc.length();
    			long start, end;
    			if (rangeValue.startsWith("-")) {
    				end = fileLength - 1;
    				start = fileLength - 1 - Long.parseLong(rangeValue.substring("-".length()));
    			} else {
    				String[] range = rangeValue.split("-");
    				start = Long.parseLong(range[0]);
    				end = range.length > 1 ? Long.parseLong(range[1]) : fileLength - 1;
    			}
    			if (end > fileLength - 1) {
    				end = fileLength - 1;
    			}
    			if (start <= end) {
    				long lengh = end - start + 1;
    				response.setHeader("Content-Length", lengh + "");
    				response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);
    				response.setHeader("Accept-Ranges", "bytes");
    				RandomAccessFile raf = new RandomAccessFile(fileloc, "r");
    				raf.seek(start);
    				OutputStream o = response.getOutputStream();
    				byte[] buffer = new byte[2096];
    				int bytesRead = 0;
    				long totalRead = 0;
    
    				while (totalRead < contentLength) {
    					bytesRead = raf.read(buffer);
    					totalRead += bytesRead;
    					o.write(buffer, 0, bytesRead);
    				}
    			}
            }





  • pousees
    439
    2021-07-27 17:49:36

    ghkdwls30

    감사합니다~!

    자바스크립트만으로도 가능할꺼라 생각했는데... 아니었네요 ㅎㅎㅎ;;;



  • 로그인을 하시면 답변을 등록할 수 있습니다.