HLS 톺아보기
Table of Contents
HLS
HTTP Live Streaming
애플이 개발한 스트리밍 프로토콜로, 네트워크 환경에 따라 동적으로 비디오 품질을 조정할 수 있는 기능을 제공한다. 실시간 스트리밍과 온디맨드 스트리밍 모두에서 널리 사용되고 있다. 주요 특징은 비디오 콘텐츠를 작은 조각으로 분할하여 HTTP를 통해 전송하는 방식으로, 안정적인 스트리밍을 제공하고, 다양한 네트워크 환경에서 효율적인 전송을 가능하게 한다.
HLS 개요 및 역사
HLS는 2009년에 애플이 처음으로 발표하였으며, 그 당시 iOS와 macOS에서 비디오 스트리밍을 개선하기 위해 개발되었다. 초기에는 iPhone과 iPad에서만 지원되었지만, 점차 다양한 디바이스에서 사용되며 스트리밍 표준으로 자리잡았다. HTTP를 기반으로 하여 기존의 웹 서버 인프라와 호환되기 때문에, 구축이 용이하고, 네트워크가 불안정한 환경에서도 뛰어난 적응성을 보인다.
특징
HLS의 주요 특징은 크게 전송 방식, 적응형 스트리밍, 호환성, 보안 및 콘텐츠 보호, 확장성, 비디오 품질 관리로 나눌 수 있다.
전송 방식 (HTTP 기반)
HTTP를 기반으로 하기 때문에 콘텐츠가 웹 서버와 클라이언트 간에 전송될 때 HTTP 요청 및 응답 형식을 따른다.
파일 조각화
HLS에서 비디오 콘텐츠는 일정 크기의 작은 세그먼트(파일 조각)로 나뉘어 전송된다. 일반적으로 각 세그먼트는 2-10초 길이의 비디오 클립으로 분할된다.
m3u8 파일 포맷
HLS는 m3u8 파일을 사용하여 각 비디오 세그먼트의 URL 목록을 정의한다. 이 파일을 통해 클라이언트는 비디오 세그먼트를 순차적으로 다운로드하고 재생할 수 있다.
범용적인 네트워크 환경 활용
HTTP 프로토콜을 사용하여 웹 서버, CDN (콘텐츠 전송 네트워크) 등과 함께 쉽게 활용할 수 있다. CDN을 활용한다면 지리적으로 분산된 사용자들에게도 빠른 스트리밍을 제공할 수 있다. 이는 대규모 비디오 스트리밍 서비스를 구축할 때 큰 장점으로 적용한다.
적응형 스트리밍 (Adaptive Bitrate Streaming)
적응형 비트레이트 스트리밍이란 네트워크 상태나 장치 성능에 맞게 비디오 품질을 실시간으로 조정하는 기능을 말한다. HLS는 이를 통해 안정적이고 버퍼링 없는 스트리밍 환경을 제공한다.
여러 비트레이트 레벨 지원
비디오 콘텐츠는 여러 해상도 및 비트레이트로 인코딩된 파일 세그먼트를 제공한다. 예를 들어 240p, 480p, 720p, 1080p 해상도로 각각 인코딩된 파일이 준비된다.
비트레이트는 초당 전송되는 데이터 양으로, 해상도와 품질에 직접적인 영향을 준다.
네트워크 상태에 따른 자동 품질 조정
클라이언트는 현재의 네트워크 대역폭에 따라 적합한 비트레이트의 비디오 세그먼트를 요청한다. 예를 들어, 느린 네트워크에서는 낮은 해상도의 세그먼트가 선택되고, 빠른 네트워크에서는 고해상도 비디오로 전환된다.
버퍼링 최소화
적응형 스트리밍 덕분에 HLS는 네트워크 상황이 급격하게 변하더라도 비디오 품질을 동적으로 변경하여 버퍼링을 최소화하고 끊김 없는 재생을 제공할 수 있다.
호환성 (Cross-Platform Compatibility)
HLS는 다양한 플랫폼과 디바이스에서 널리 지원되는 스트리밍 프로토콜로, 광범위한 호환성을 자랑한다.
모바일 및 데스크탑 지원
iOS, Android, macOS, Windows 등 대부분의 모바일 및 데스크탑 환경에서 기본적으로 지원된다.
웹 브라우저 호환성
HLS는 기본적으로 브라우저에서 지원되지 않지만, Hls.js
와 같은 JavaScript 라이브러리를 사용하면 브라우저에서 HLS 스트리밍을 구현할 수 있다.
스마트 TV 및 스트리밍 장치
삼성 스마트 TV 등 다양한 스마트 TV와 OTT(Over-the-Top) 장치도 지원한다.
m3u8
m3u8 파일은 HLS에서 사용되는 메타데이터 파일로, 스트리밍 콘텐츠의 재생 정보를 정의한다. UTF-8로 인코딩된 텍스트 파일이며, 스트리밍 미디어 플레이어가 재생할 수 있는 세그먼트(미디어 파일)의 목록과 재생 정보를 제공한다.
마스터 플레이리스트
m3u8 파일의 유형 중 하나로, 재생 가능한 여러 품질 (비트레이트 및 해상도)의 미디어 스트림을 정의하는 파일이다. 각 품질별 스트림에 대한 메타데이터와 해당 미디어 플레이리스트(M3U8 파일)의 경로를 포함한다.
Hls는 마스터 플레이리스트를 참고하여 다중 해상도 및 비트레이트를 제공하며, 결과적으로 네트워크 환경에 따른 적응형 스트리밍 지원이 가능해진다.
구성 요소
실제 서비스 중인 m3u8의 마스터 플레이리스트를 뜯어보면 다음과 같다.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=5156800,AVERAGE-BANDWIDTH=3440800,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1080x1920,FRAME-RATE=30.000
d1bac5c8ba3545608cb48514beb63c10_3.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3115200,AVERAGE-BANDWIDTH=2085600,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=720x1280,FRAME-RATE=30.000
d1bac5c8ba3545608cb48514beb63c10_2.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1408000,AVERAGE-BANDWIDTH=950400,CODECS="avc1.64001e,mp4a.40.2",RESOLUTION=360x640,FRAME-RATE=30.000
d1bac5c8ba3545608cb48514beb63c10_1.m3u8
- #EXTM3U
- 이 파일이 M3U8 포맷임을 명시.
- #EXT-X-VERSION:3
- HLS 프로토콜의 버전.
- #EXT-X-INDEPENDENT-SEGMENTS
- 모든 미디어 세그먼트가 독립적(Independent)임을 명시.
- 독립 세그먼트는 이전 세그먼트의 디코딩 정보가 없어도 재생 가능한 구조이므로, 특정 세그먼트를 바로 재생할 수 있어 적응형 스트리밍에서 유리하다.
- #EXT-X-STREAM-INF
- 각 스트림에 대한 정보 (첫 번째 스트림 기준)
이름 설명 BANDWIDTH 스트림의 최대 대역폭
예시) 약 5.16 Mbps.AVERAGE-BANDWIDTH 평균 대역폭
예시) 약 3.44 Mbps.CODECS CODECS: H.264(영상)와 AAC(오디오)와 같은 스트림에서 사용하는 코덱을 명시. RESOLUTION 해상도
예시) 풀 HD 해상도. 1080 x 1920FRAME-RATE 초당 프레임
예시) 30 FPSd1bac5c8ba3545608cb48514beb63c10_3.m3u8 해당 스트림의 미디어 플레이리스트 파일 경로. - 그 외 스트림도 각각의 정보를 갖고 있다.
동작 방식
- 플레이어가 마스터 플레이리스트를 로드하고 각 스트림에 대한 정보를 확인한다.
- 네트워크 상태와 기기 스펙 (해상도, 처리 성능 등)을 기반으로 적합한 스트림을 선택한다.
- ex) 빠른 네트워크에서는 1080p, 느린 네트워크에서는 360p를 선택.
- 재생 중 네트워크 상태가 변경되면 다른 스트림으로 동적으로 전환하여 끊김 없는 스트리밍을 제공한다.
미디어 플레이리스트
마스터 플레이리스트에 명시된 m3u8 플레이리스트로, 실제 영상 출력을 담당한다. ts 확장자의 미디어 세그먼트 파일을 갖고 있으며, 이 세그먼트에는 비디오와 오디오 데이터가 포함되어있다.
구성 요소
#EXTM3U
#EXT-X-ALLOW-CACHE:NO
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:2.00000,
d1bac5c8ba3545608cb48514beb63c10_2_00001.ts
#EXTINF:2.00000,
d1bac5c8ba3545608cb48514beb63c10_2_00002.ts
#EXTINF:2.00000,
d1bac5c8ba3545608cb48514beb63c10_2_00003.ts
#EXTINF:2.00000,
d1bac5c8ba3545608cb48514beb63c10_2_00004.ts
#EXTINF:2.00000,
d1bac5c8ba3545608cb48514beb63c10_2_00005.ts
#EXTINF:2.00000,
...
- #EXTM3U
- 이 파일이 M3U8 포맷임을 명시.
- #EXT-X-ALLOW-CACHE:NO
- 캐싱 허용 여부.
- VOD (Video on Demand) 콘텐츠는 주로 NO를 명히사여, 항상 최신 버전의 플레이리스트를 요청하도록 강제한다.
- 라이브 스트리밍에서는 캐싱을 제한해 최신 데이터를 보장하지만, VOD에서는 성능 최적화를 위해 캐싱을 허용하기도 한다.
- #EXT-X-VERSION:3
- HLS 프로토콜의 버전.
- #EXT-X-TARGETDURATION:2
- 미디어 세그먼트의 최대 지속 시간(초)
- 실제 세그먼트 길이는 이 값보다 클 수 없으며, 플레이어는 이를 기반으로 버퍼링 전략을 수립한다.
- #EXT-X-MEDIA-SEQUENCE:1
- 미디어 세그먼트의 고유 시퀀스 번호.
- 실시간 스트리밍(Live)에서 동기화 및 업데이트를 추적하는 데 사용된다.
- #EXT-X-PLAYLIST-TYPE:VOD
- 플레이리스트의 타입.
- EVENT, VOD 2개가 존재한다.
- EVENT는 이벤트 기반 스트리밍에 사용되며, VOD는 완전히 종료된 방송을 송출하는데 사용되며 모든 세그먼트가 고정된 형태로 포함된다.
- #EXTINF:2.00000
- 각 세그먼트의 지속 시간(초)
- d1bac5c8ba3545608cb48514beb63c10_2_00001.ts
- 미디어 세그먼트 파일 이름
- .ts 파일은 MPEG-TS(Transport Stream) 형식으로, 비디오와 오디오 데이터를 포함한다.
마치며
라이브커머스 회사에 다니는데 회사가 사용하는 기술 정도는 알고 있어야 하지 않느냐 라는 피드백이 가슴 깊이 꽂혀서 얕게나마 알아보았습니다.
HLS를 처음 접하는 분들에게 작게나마 도움이 되기를 바랍니다. 🙌