HLS
HLS (HTTP Live Streaming)
HLS는 Apple에서 2009년 출시한 Adaptive HTTP Streaming으로 다음과 같은 장점을 가졌다. HLS의 기본 컨셉은 media를 segment라는 수 초 단위의 video file로 나누어 저장한 뒤, 이를 관리할 playlist file을 둔다. Client는 playlist을 먼저 받음으로써 어떤 segment의 path를 조회할 수 있으며, 각각의 segment가 필요한 시점에 서버에 요청을 보낸다. 이로써 client는 영상 중 필요한 일부만을 다운로드하여 재생할 수 있다.
서버는 다양한 bitrate로 변환한 미디어를 저장한 후 클라이언트는 네트워크 상황에 맞게 bitrate를 선정하여 재생할 수 있다. 또한 protocol에서의 encryption 지원하기 때문에 content 보안 측면에서도 장점이 있다. HLS의 장점을 정리하면 다음과 같다. [0]
- Adaptive bandwidth를 지원
- Live / VoD 모두를 지원하기에 적합
- Media encryption을 지원
Playlist
HLS의 playlist는 M3U 형식으로 작성이 되어있으며 UTF-8로 encoding 된다. Fig. 1에 보이는 HLS playlist의 예시를 살펴보면, plain text형식으로 tag: value가 반복적으로 나열되어있다. HLS playlist는 항상 Extended M3U를 의미하는 #EXTM3U tag로 시작한다. 각 tag의 의미는 다른 문서에서 다룰 예정이다.
Fig. 1: Simple Example of HLS Playlist [1]
HLS playlist 는 Master playlist와 Media playlist로 구분된다. Media playlist는 Fig. 1의 예시로 보인거처럼 재생해야하는 segment가 정보가 연속적으로 등장한다. Master playlist를 이용하면 더 복잡한 streaming을 구현할 수 있다. Fig. 2와 같 Master playlist는 다양한 bitrate의 video 혹은 다양한 언어에 대한 audio stream에 대한 Media playlist포함 할 수 있다.
Fig. 2: Simple Example of Master Playlist [1]
HLS file들의 관를 정리하면 Fig. 3처럼 Master playlist에서는 Media playlist에 대한 정보를 기술하고 있으며, Media playlist에서는 Media segment에 대한 정보를 기술하고 있다.
Media Segment
Media playlist에는 Media segment가 담겨있다. Media segment는 URI로 특정된다. 각각의 Media segment는 Media playlist안에서 unique sequence number를 갖는다. Media segment는 EXT-X-DISCONTINUITY tag를 통해 명시하지 않는 이상 순적으로 재생된다.
HLS는 다양한 Media segment format을 지원한다. 일부 format은 segment를 parsing하기 전에 initialize과정이 필요한데, 이를 Media initialize section이라고 한다. Media initialize section은 EXT-X-MAP tag를 이용하여 명시할 수 있다.
MPEG-2 Transport Streams (MPEG-TS)
MPEG-TS는 가장 널리 쓰이는 HLS segment format중 하나이다. 미디어 데이터의 송신을 위한 프로토콜로 개발되었고, 파일 컨테이너로도 사용된다. MPEG-TS segment의 Media initialize section으로는 PAT (Program Association Table)과 PMT (Program Map Table)이 존재한다. PAT와 PMT는 EXT-X-MAP로 명시되거나, 처음 두 개의 Media segment로 대체된다.
Fragmented MPEG-4 (fMp4)
일반적인 MPEG-4 (Mp4) 파일이 moov (Movie Box)와 mdat (Media Data Box)으로 구성되어 있는 것과 달리, fMp4는 moof (Movie Fragment Box)와 mdat으로 구성되어있다. fMp4 segment는 EXT-X-MAP tag를 통해서 moov를 포함하고 있는 Media initialize section을 명시해야 한다. fMp4의 Media initialize section은 iso6 이상과 호환되는 ftyp (File Type Box) 를 포함하고 있어야 한다. 그리고는 moov가 위치한다. moov에는 모든 segment안의 모든 traf (Track Fragment Box)를 포함하는 trak(Track Box). 이때 trak 내부의 sample의 개 수를 나타내는 sample count는 0이어야 한다. 그리고 mvhd (Movie Header Boxes)와 tkhd (Track Header Boxes)의 duration은 0으로 기록되어야 한다. 마지막으로 mvex (Movie Extends Box)가 존재한다. 이는 CMAF (Common Media Application Format) Header의 표준이기도 하다.
fMp4 segment는 실제 압축된 미디어 데이터를 수반한다. fMp4의 traf는 tfdt (Track Fragment Decode Time Box)를 포함하고 있어야 한다. 또한 fMp4는 movie-fragment relative addressing을 해야 한다 (mdat의 위치가 가장 나중에 등장한 moof를 기준으로 함).
Packed Audio
Pakced Audio Segment는 압축된 audio sample과 ID3 tags를 포함한다. 지원하는 codec으로는 AAC (Advanced Audio Coding), ADTS (Audio Data Transport Stream), MP3 (MPEG Layer-3), AC3 (Audio Coding-3)가 있다. Pakced Audio Segment는 Media initialize section이 존재하지 않는다. 각각의 Packed Audio Segment는 가장 앞의 sample의 PRIV (Private frame) tag에만 timestamp가 기록되어있다.
WebVTT
WebVTT는 subtitle을 위한 segment로, WebVTT 파일로 되어있다. WebVTT Segment의 Media initialize section은 WebVTT의 Header이다. 각각의 WebVTT Segment는 EXTINF tag로 명시된 재생 시간에 보여 subtitle cues를 가지고 있다. 각각의 cue의 start time과 end time을 통해서 display time이 결정된다. audio/video와의 동기화를 위해서,
1
X-TIMESTAMP-MAP=LOCAL:<cue time>,MPEGTS: <MPEG-2 time>
와 같이 X-TIMESTAMP-MAP tag를 각각의 WebVTT마다 지정하여, cue timestamp를 MPEG-2 timestamp로 맵핑한다. 하지만 이 tag가 없다면 client는 cue time과 MPEG-2을 각각 0으로 가정해야한다.
Encryption & Decryption
Media segment는 콘텐츠의 보호를 위해 encrypt되어 있을 수 있다. Encrypt된 Media segment의 Media playlist는 EXT-X-KEY tag를 포함해야 하며, EXT-X-KEY은 key file의 URI를 명시해야 한다. Encryption 방법에는 AES-128, SAMPLE-AES, COMMON_ENC (for fMp4)가 있다.