M3U8 완전 정리: HLS 스트리밍을 떠받치는 재생 목록 파일의 구조

목차

  1. .m3u8은 사실 동영상이 아니다
  2. 재생 목록 한 장 해부하기
  3. 마스터와 미디어, 두 층으로 나뉜 구조
  4. 화질이 저절로 바뀌는 원리
  5. 라이브와 VOD를 가르는 한 줄
  6. 직접 눈으로 확인하기

.m3u8은 사실 동영상이 아니다

파일 목록에서 .m3u8을 발견하면 동영상처럼 보이지만, 텍스트 편집기로 열어 보면 줄글이 나옵니다. m3u8은 재생 순서가 적힌 텍스트 명세서일 뿐이고, 영상의 실체는 재생 목록이 가리키는 TS 조각들에 있습니다. 이름 맨 뒤의 8은 UTF-8 인코딩을 뜻합니다.

텍스트와 미디어가 이렇게 분리된 덕분에 HLS는 "전부 내려받고 나서 보는" 방식을 벗어났습니다. 플레이어는 명세서를 읽고, 필요한 조각만 골라 순서대로 요청하고, 도착하는 즉시 화면에 올립니다.

재생 목록 한 장 해부하기

짧은 VOD 영상의 미디어 재생 목록은 대개 이런 모습입니다:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:7.5,
chunk-a027.ts
#EXTINF:8.0,
chunk-a028.ts
#EXTINF:7.2,
chunk-a029.ts
#EXT-X-ENDLIST

위에서부터 차례로 읽어 보겠습니다.

마스터와 미디어, 두 층으로 나뉜 구조

서비스 규모의 스트림에서는 재생 목록이 두 층으로 갈라집니다. 최상위에 마스터 재생 목록이 있고, 그 아래 화질별 미디어 재생 목록이 매달립니다. 마스터 파일을 열면 대략 이렇게 생겼습니다:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2149280,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=947000,RESOLUTION=640x360
360p/index.m3u8

BANDWIDTH는 그 화질을 끊지 않고 재생하는 데 필요한 대략적인 회선 속도이고, 그다음 줄은 실제 조각 목록을 담은 하위 재생 목록의 주소입니다. 주소가 또 다른 m3u8을 가리키고 있죠. 즉 "재생 목록이 다른 재생 목록을 소개하는" 이중 구조입니다. 파일 안에 #EXT-X-STREAM-INF가 보이면 마스터, #EXTINF만 나열되어 있으면 미디어 재생 목록으로 판단하면 됩니다.

화질이 저절로 바뀌는 원리

이 두 층 구조가 바로 적응형 비트레이트(ABR)의 토대입니다. 플레이어는 최근 몇 개 조각의 실제 내려받기 속도를 재서, 마스터에 적힌 BANDWIDTH 값과 견주어 지금 버틸 수 있는 화질을 고릅니다. 회선이 흔들리면 360p로 내려가고, 회복되면 다시 720p로 올라섭니다.

시청자는 이 판단을 버튼으로 누르지 않습니다. 영상 서비스에서 화질이 스스로 오르내리는 이유가, 바로 마스터 재생 목록의 후보들 사이에서 플레이어가 끊임없이 저울질을 하고 있기 때문입니다.

라이브와 VOD를 가르는 한 줄

같은 형식인데 라이브와 다시 보기가 다르게 움직이는 이유는 의외로 단순합니다. VOD는 목록 끝에 #EXT-X-ENDLIST가 찍혀 있어 플레이어가 "다 받았다"는 사실을 압니다. 라이브에는 이 표지가 없고, 대신 서버가 방송이 진행되는 동안 목록 앞의 오래된 조각을 지우고 새 조각을 뒤에 붙입니다. 플레이어는 일정 간격으로 같은 재생 목록 주소를 다시 요청하며 밀려오는 창(window)을 따라가는 것이죠.

직접 눈으로 확인하기

구조를 알면 문제 해결도 빨라집니다. 재생되지 않는 스트림이라도 m3u8을 텍스트로 열어 보면 어디가 비어 있는지 드러납니다. 주소를 온라인 플레이어에 넣어 동작을 관찰해 보고, 더 깊은 주제는 튜토리얼에서 이어 살펴보세요.