실무를 수행하며 HLS라는 단어를 처음 들어봤습니다. CDN 업무를 수행하며 OVP(Online Video Platform)을 운영하고 있는데요 처음에 HLS에 대한 정보도 부족하고 어떻게 실제 작동하는지에 대한 지식이 부족해 어려움을 겪었습니다. 지금은 어느정도 HLS에 대해 이해하고 있지만 알고 있는 내용을 한번 정리해 보기 위해 이 글을 씁니다.
HTTP Live Streaming(HLS)는 Apple에서 개발한 미디어 스트리밍 프로토콜로 비디오 콘텐츠를 인터넷을 통해 실시간 또는 On-demand로 스트리밍 하는데 사용됩니다. 현재 널리 사용되는 Adaptive Bitrate StReaming(ABR) 입니다.
HLS의 특징으로는
이 있습니다.
그림을 보면 조금 더 이해가 쉬워 그림을 한번 봐볼까요?

위의 그림처럼 Master Playlist 안에는 다양한 품질의 Media Playlist가 있으며 그 안에는 미디어 조각들인 Media Segment가 존재합니다.
예시를 보며 조금 더 자세히 알아보겠습니다.
실제 HLS 영상을 분석할때, Chrome 개발자 도구를 사용해서 Master Playlist, Media Playlist, Media Segment를 다운로드 하는 것을 볼 수 있습니다.

먼저 Master Playlist의 내용을 보겠습니다.
(여기에서는 playlist.m3u8)
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=3513750,RESOLUTION=1920x1080,FRAME-RATE=25.000,NAME="1080P",CLOSED-CAPTIONS=NONE
https://test/good_1080P/v/chunklist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1241250,RESOLUTION=1280x720,FRAME-RATE=25.000,NAME="720P",CLOSED-CAPTIONS=NONE
https://test/good_720P/v/chunklist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=351250,RESOLUTION=640x360,FRAME-RATE=25.000,NAME="360P",CLOSED-CAPTIONS=NONE
https://test/good_360P/v/chunklist.m3u8

앞서 설명드렸던 것처럼 다양한 품질의 Media Playlist들의 URL을 가지고 있는것을 알 수 있습니다.
이 URL을 바탕으로 사용자들의 대역폭(Bandwidth)를 측정하여 대역폭에 맞는 동영상을 재생하게 됩니다.
그러면 사용자의 대역폭은 어떻게 알 수 있을까요?
➡️ 플레이어(HLS.js, Safari 등)가 일부 세그먼트를 다운로드해보고, 그 속도와 크기를 기반으로 실제 네트워크 대역폭을 계산해서 알맞은 해상도를 선택합니다.
위의 Master Playlist의 태그의 의미는
#EXTM3U : 파일이 M3U8 형식(HLS playlist)임을 나타내는 태그
#EXT-X-STREAM-INF : 미디어 플레이리스트에 대한 정보를 제공하는 태그
두번째로 Media Playlist 입니다.
(여기서는 chunklist.m3u8)
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
/test/good_1080P/v/0.ts
#EXTINF:10.0,
/test/good_1080P/v/1.ts
#EXTINF:10.0,
/test/good_1080P/v/2.ts
#EXTINF:7.28,
/test/good_1080P/v/3.ts
#EXT-X-ENDLIST

Media Playlist안에는 전체 영상에서 특정 시간 초로 분리된 미디어 조각들의 정보가 있습니다.
이 미디어 조각들을 다운로드 하며 영상을 재생하는 구조로 설명할 수 있습니다.
위의 Media Playlist의 태그의 의미는
#EXTM3U : 파일이 M3U8 형식(HLS playlist)임을 나타내는 태그
#EXT-X-VERSION:3 : HLS 버전 3 사용
#EXT-X-TARGETDURATION:10 : 가장 긴 세그먼트의 재생 시간 (초) 기준값
#EXT-X-MEDIA-SEQUENCE:0 : 첫 세그먼트의 순번 (시작 인덱스)
#EXTINF:10.0 : 다음 세그먼트의 재생 시간 (초 단위)
#EXT-X-ENDLIST : 더 이상 세그먼트가 없음을 의미 (VOD 완료 표시)
입니다.
마지막으로 Media Segmnet입니다.
(여기에서는 0.ts)
이 Segment 는 실제 미디어이기 때문에 실제 브라우저 창에 0.ts의 요청 URL을 입력하게 되면 10초로 분리 된 동영상이 다운로드 됩니다.

실제 .ts 파일을 URL에 입력했을 경우

위의 그림과 같이 조각난 동영상의 일부가 다운로드 되게 됩니다.
이 동영상들을 조합하게 된다면 하나의 완전한 동영상이 완성되게 됨으로서 스크린 녹화를 하지 않고도 원본 동영상을 얻을 수 있습니다.
이러한 악용사례를 방지하기 위해 DRM 솔루션들이 있는데, 그 부분은 다음번에 다뤄보겠습니다.
그러면 HLS는 어떻게 동작할까요?
1. 인코딩 & 패키징
2. 전송
3. 재생
이러한 순서로 동작하게 됩니다.

그림으로 보면 조금 이해하기 쉬울것 같습니다!
HLS는 HTTP 형식이기 때문에 앞서 말한것 처럼 CDN 적용이 가능하여 아직까지도 많은 사랑을 받고 있습니다!
https://developer.apple.com/library/archive/referencelibrary/GettingStarted/AboutHTTPLiveStreaming/about/about.html
https://www.cloudflare.com/ko-kr/learning/video/what-is-http-live-streaming/
https://developer.apple.com/documentation/http-live-streaming
유익해요