ToyProject

[Catarie] HLS와 업로드 흐름

sihanni 2025. 8. 28. 03:26

HLS ?

HLS (HTTP Live Streaming) 는 Apple이 개발한 HTTP 기반의 적응형 스트리밍 프로토콜이다. 비디오를 작은 조각으로 나누어 전송하며 네트워크 환경에 따라 실시간으로 화질을 조절하여 끊김 없이 스트리밍을 가능하게 한다.

긴 영상을 작은 청크(조각)로 잘라서 스트리밍하는 방식이다. 영상 전체를 한 번에 받는 게 아니라, 재생 플레이어가 필요한 순간에 작은 조각만 다운로드 하면서 이어 붙여 보여주는 방식이다.

그래서 네트워크가 끊기거나 느려도 중간부터 이어서 볼 수 있고, 적응형 화질(Adaptive Bitrate)도 쉽게 구현 가능하다.

즉, HLS는 mp4/mp3 원본을 FFmpeg 같은 도구로 트랜스코딩해서 m3u8 + ts 세그먼트로 변환환 뒤, 클라이언트는 이르 조립하듯 이어붙여 재생하는 구조.

원본은 하나지만, 세그먼트화되면서 스트리밍 친화적인 포맷으로 변환되기 때문에 빠른 시작, 적응형 화질, 끊김 최소화라는 장점을 얻게 된다.

index.m3u8과 *.ts

HLS의 전형적인 산출물

 

.m3u8 파일은 *UTF-8로 인코딩된 재생 목록 파일이다. 주로 HLS 프로토콜에서 사용되며, 비디오 또는 오디오 스트림의 세그먼트 파일 위치를 지정하는 데 사용된다. 즉, 실제 미디어 파일 자체는 아니고, 해당 파일들이 어디에 있는지를 알려주는 역할을 한다.

m3u8 파일은 라이브 스트리밍(실시간 방송)과 주문형 스트리밍(원하는 시간에 재생) 모두에 사용될 수 있다.

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:6.000,
index0.ts
#EXTINF:6.000,
index1.ts
#EXTINF:6.000,
index2.ts
...
#EXT-X-ENDLIST

m3u8 파일에는 위와 같은 내용이 포함될 수 있다. 

  • EXTINF : 각 세그먼트 파일 ( *.ts ) 의 지속 시간(단위: seconds)을 나타낸다.
    • 이 단위는 hls 트랜스를 할때 설정해줄 수 있다. 
  • EXT-X-ENDLIST : 스트림의 끝을 표시한다.

동영상이나 음원을 *FFmpeg 같은 도구로 변환하면 위와 같은 형식으로 묶여서 저장이된다.

플레이어(브라우저 또는 앱)는 index.m3u8 을 먼저 읽고, 안에 적힌 *.ts 세그먼트 경로를 순서대로 다운로드, 재생하게 된다.

FFmpeg, Apple 공식 HLS 문서 기준 기본 세그먼트 길이는 6초이고, 별도 옵션을 주지 않으면 6초의 단위로 잘리게 된다.

과거에는 6~10초가 일반적으로 사용되었고 최근 저지연 HLS(LL-HLS)의 도입으로 2~4초, 라이브 방송의 경우 1초단위까지 세팅된다고 한다. 특히 유튜브 쇼츠나 틱톡과 같이 짧은 영상에서 반응을 빠르게 하기 위해서는 2~4초로 짧게 설정해서 첫 청크를 빨리 내려받아 바로 재생되도록 최적화하는 것이 좋다.

세그먼트 길이 장점 단점 사용 예시
2~3초 시작이 빠르고, 지연(latency) 최소화 세그먼트 파일 개수가 많아짐 → 서버 부하 ↑, HTTP 요청 수 ↑ 숏폼(틱톡), 라이브 방송(저지연 필요)
4~6초 균형 잡힘, CDN 캐시 효율 좋음, 서버 부담 적음 초기 재생 시작은 약간 늦을 수 있음 VOD(유튜브 일반 영상), 넷플릭스, 일반 HLS
10초 이상 파일 개수 적음, 서버·네트워크 효율 ↑ 시작 지연 ↑, 끊김 발생 시 리커버리 느림 과거 방송/대용량 아카이브용

Gavarnie 의 경우 음원과 짧은 영상 재생을 하기 때문에 빠른 반응을 위해 2~4 로 설정을 하게 될 예정이다. 

왜 쪼개는가?

  • 빠른 시작: 영상 전체 다운로드 필요 없이 첫 번째 세그먼트만 받으면 바로 재생 시작 가능.
  • 적응형 화질: 여러 버전(720p/480p 등) m3u8을 준비해두면 네트워크 속도에 맞춰 자동 전환.
  • 회복력: 네트워크 끊김 시 중간 세그먼트만 다시 요청하면 됨.
  • CDN 친화적: 작은 ts 파일들을 캐시하기 쉽고, 글로벌 배포에 효율적임.

HLS 변환 흐름

원본 -> 세그먼트 -> 재생

1) 원본(mp4/mp3) 업로드된 하나의 파일

2) 세그먼트화(FFmpeg 변환)

  • 원본을 일정 시간 단위로 잘라서 작은 조각 (.ts) 여러 개로 분할
  • 동시에 재생목록 파일 (.m3u8)을 만들어 어떤 조각이 어디 있는지 기록

3) 산출물 (.m3u8과 ts파일들)

3) 플레이어 재생

  • 플레이어(브라우저/앱)는 m3u8을 먼저 읽음
  • 그 안에 적힌 ts 조각들을 순서대로 내려받아 이어 붙여 재생
  • 첫 번째 조각만 받아도 바로 재생 시작이 가능함 (빠른 반응)

장점 요약

 

  • 빠른 시작
  • 네트워크 상태에 따라 화질 자동 조절(Adaptive Bitrate)
  • 끊겨도 필요한 조각만 다시 받아서 이어감

 


UTF-8

UTF-8 (UCS Transformation Format 8)은 월드 와이드 웹의 가장 일반적인 문자 인코딩이다. 각 문자는 1~4 바이트로 표시된다.

ASCII와 역호환되며 표준 유니코드 문자를 나타낼 수 있다.

 

FFmpeg

모든 동영상, 음악, 사진 포맷들의 디코딩과 인코딩을 목표로 만들어지고 있는 오픈 소스 프로젝트이다.

인코딩 도구라고 생각하면 된다.

FFmpeg 프로젝트 자체가 모든 영상의 디코딩/인코딩을 지향하기 때문에 추가적인 코덱의 설치가 필요 없다.