-
스프링과 스트리밍 서버프로젝트/미디어 스트리밍 서버 프로젝트 2022. 12. 23. 00:01
https://junuuu.tistory.com/467
이전시간에 스트리밍 서버에 대해서 알아보고 멀티미디어 전송방식에 대해서 알아보았습니다.
개요
각 전송방식에 대해 스프링을 활용하여 어떻게 구현할 수 있는지 알아보겠습니다.
HTML5(video) + Spring Boot : Progressive download
HTML5 태그 중 VIDEO 태그를 사용하여 웹에서 동영상을 플레이하는 기능입니다.
HTML 소스에서는 아래와 같이 호출합니다.
... <video controls src="/download?fileName=test.mp4"> not use video </video> ...
Spring Boot에서는 StreamingResponseBody를 이용합니다.
... private final String DIR = "${FILE_DIR}/"; @GetMapping("/download") public StreamingResponseBody stream(HttpServletRequest req, @RequestParam("fileName") String fileName) throws Exception { File file = new File(DIR + fileName); final InputStream is = new FileInputStream(file); return os -> { readAndWrite(is, os); }; } private void readAndWrite(final InputStream is, OutputStream os) throws IOException { byte[] data = new byte[2048]; int read = 0; while ((read = is.read(data)) > 0) { os.write(data, 0, read); } os.flush(); } ...
서버에서는 요청시마다 전체 파일을 보내주고 video 태그에서는 점진적으로 필요한 만큼씩 OutputStream에서 읽어가게 됩니다.
StreamingResponseBody 클래스는 TaskExecutor를 이용하여 비동기 서블릿 실행을 지원합니다.
또한 Range 헤더를 사용하여 서버 파일의 특정 부분을 요청할 수 있습니다.
GET https://www.w3schools.com/html/mov_bbb.mp4 Range: bytes=0-99 ...
응답 헤더들은 다음과 같습니다.
Status: 206 Accept-ranges: bytes Content-Length: 100 Content-Range: bytes 0-99/788493
Spring WebFlux를 활용하여 Video Streaming을 할 수도 있습니다.
https://www.vinsguru.com/spring-webflux-video-streaming/
https://www.youtube.com/watch?v=_PEPaWFs064
코루틴을 활용한 비동기 처리
https://appleg1226.tistory.com/16
S3만을 사용할 때 단점
더 나은 비디오 로드 시간을 위해 S3와 함께 AWS CloudFront CDN을 사용할 수 있습니다.
하지만 비디오의 크기가 큰 경우가 많고 비디오 최적화 기능이 내장되어 있지 않습니다.
이 문제를 해결하기 위해서는 AWS Elemental Mediaconvert를 사용하여 모든 종류의 트랜스코딩과 최적화를 사용할 수 있습니다.
하지만 러닝 커브가 존재하며 관리가 복잡해집니다.
ImageKit를 사용하면 AWS S3에 저장된 비디오를 간단한 설정으로 최적화 및 변환할 수 있습니다.
시도한 방법
저장할 비디오를 S3에 저장 -> 저장하면서 반환된 URL을 DB에 저장 -> 사용자가 조회시 DB의 S3 URL제공 -> URL을 클라이언트에 넘겨주면 Player를 통해 재생
출처
https://derveljunit.tistory.com/311
https://luvstudy.tistory.com/172
https://jistol.github.io/spring/2018/04/04/springboot-video-streaming/
https://saravanastar.medium.com/video-streaming-over-http-using-spring-boot-51e9830a3b8
https://melgenek.github.io/spring-video-service
https://css-tricks.com/streaming-optimized-videos-from-aws-s3-in-minutes/
'프로젝트 > 미디어 스트리밍 서버 프로젝트' 카테고리의 다른 글
S3 pre-signed url 만들기(Kotlin + Spring) (0) 2023.01.06 Adaptive Bitrate와 MPD파일 (0) 2023.01.05 [Kotlin] AWS S3에 업로드하기 (0) 2022.12.19 AWS Foundation 기반 온디맨드 비디오 솔루션 구현 - 이론편 (0) 2022.12.12 OTT는 어떻게 콘텐츠를 보호할까? (0) 2022.12.08