Skip to content

hls.js로 알아보는 스트리밍

Minseok Park edited this page Dec 3, 2024 · 2 revisions

들어가며

HTTP Live Streaming(HLS)은 Apple이 개발한 스트리밍 프로토콜로, iOS와 Safari에서는 네이티브로 지원되어 <video> 태그에 스트림 주소를 직접 넣기만 해도 쉽게 스트리밍이 가능합니다. 하지만 Chrome, Firefox와 같은 다른 브라우저에서는 이러한 네이티브 지원이 없어 Media Source Extensions(MSE)라는 웹 API를 활용해 직접 구현해야 합니다. 이 환경적 차이를 극복하고 크로스 브라우저 환경에서 HLS 스트리밍을 가능하게 해주는 것이 바로 hls.js입니다.

스트리밍의 기본 구성 요소

1. HTML5 Video Element와 Media Source Extensions (MSE)

웹에서 비디오를 재생하기 위한 기본 요소는 HTML5의 <video> 태그입니다. 하지만 스트리밍 환경에서는 동적으로 데이터를 추가할 수 있는 MSE(Media Source Extensions)가 필요합니다.

  • MSE 주요 기능
    1. SourceBuffer 생성
      MediaSource.addSourceBuffer(mimeType)를 호출해 SourceBuffer를 생성합니다.
    2. 미디어 데이터 추가
      SourceBuffer.appendBuffer()로 TS 또는 fMP4 데이터를 추가합니다.
    3. 버퍼 관리
      오래된 데이터를 제거하거나 중복 데이터를 관리하여 실시간 스트리밍을 지원합니다.

2. m3u8: 스트리밍의 설계도

m3u8 파일은 HLS 스트리밍의 "설계도" 역할을 하며, 두 가지 주요 형태가 있습니다:

  • 마스터 플레이리스트
    사용 가능한 모든 품질의 스트림을 정의합니다.
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=720x480
video_720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720
video_1080p.m3u8
  • 미디어 플레이리스트
    실제 재생할 미디어 세그먼트 목록을 포함합니다.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:9.009,
segment1.ts
#EXTINF:9.009,
segment2.ts

3. 미디어 컨테이너: TS와 fMP4

HLS 스트리밍에서 사용되는 미디어 컨테이너는 두 가지가 있습니다:

  1. MPEG-2 Transport Stream(TS)

    • 고정 크기(188바이트) 패킷으로 구성.
    • MSE와 직접 호환되지 않음.
  2. Fragmented MP4(fMP4)

    • MSE와 직접 호환 가능.
    • DASH와 같은 다른 스트리밍 프로토콜과도 호환.

hls.js의 동작 원리

1. 동작 과정

  1. m3u8 파싱: HLS.js가 마스터/미디어 플레이리스트를 읽고 필요한 정보를 추출합니다.
  2. 세그먼트 로드: HTTP 요청으로 세그먼트를 다운로드합니다.
  3. Transmuxing: TS 포맷 데이터를 fMP4로 변환합니다.
  4. MSE 버퍼링: 변환된 데이터를 SourceBuffer에 추가하여 브라우저에서 재생 가능하게 만듭니다.
  5. 비디오 재생: <video> 태그를 통해 최종적으로 스트림을 재생합니다.

2. Transmuxing과 Web Worker

  • TS 데이터를 fMP4로 변환하는 과정.
  • CPU 집약적인 작업으로 Web Worker를 사용해 메인 스레드에서 발생할 수 있는 성능 문제를 방지합니다.

추가 고려 사항

  1. 브라우저 지원

    • Safari: HLS를 네이티브로 지원 (hls.js 불필요).
    • MSE 미지원 브라우저에서는 작동하지 않음.
  2. DRM(디지털 저작권 관리)

    • HLS.js는 기본적으로 DRM을 지원하지 않으며 추가 솔루션이 필요.
  3. 네트워크 상태

    • 네트워크 속도가 낮을 경우 품질이 낮은 스트림으로 전환.

마치며

HLS.js는 브라우저의 기술적 제약과 다양한 미디어 포맷의 차이를 훌륭하게 해결해주는 라이브러리입니다. 이를 활용해 크로스 브라우저 환경에서 안정적인 HLS 스트리밍을 구현할 수 있습니다.

👋 소개
📖 회의록
🗓️ 개발일지
🗃 설계 문서
🕵️‍♂️ 회고록
💪 멘토링 일지
🎳 트러블 슈팅
💽 발표자료
Clone this wiki locally