HLS ?
HLS (HTTP Live Streaming) 는 Apple이 개발한 HTTP 기반의 적응형 스트리밍 프로토콜이다. 비디오를 작은 조각으로 나누어 전송하며 네트워크 환경에 따라 실시간으로 화질을 조절하여 끊김 없이 스트리밍을 가능하게 한다.
긴 영상을 작은 청크(조각)로 잘라서 스트리밍하는 방식이다. 영상 전체를 한 번에 받는 게 아니라, 재생 플레이어가 필요한 순간에 작은 조각만 다운로드 하면서 이어 붙여 보여주는 방식이다.
그래서 네트워크가 끊기거나 느려도 중간부터 이어서 볼 수 있고, 적응형 화질(Adaptive Bitrate)도 쉽게 구현 가능하다.
즉, HLS는 mp4/mp3 원본을 FFmpeg 같은 도구로 트랜스코딩해서 m3u8 + ts 세그먼트로 변환환 뒤, 클라이언트는 이르 조립하듯 이어붙여 재생하는 구조.
원본은 하나지만, 세그먼트화되면서 스트리밍 친화적인 포맷으로 변환되기 때문에 빠른 시작, 적응형 화질, 끊김 최소화라는 장점을 얻게 된다.
index.m3u8과 *.ts


.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 프로젝트 자체가 모든 영상의 디코딩/인코딩을 지향하기 때문에 추가적인 코덱의 설치가 필요 없다.
'ToyProject' 카테고리의 다른 글
| [Catarie] 상용 배포 후 이미지들이 다르게 뜨는 이슈 (0) | 2025.09.13 |
|---|---|
| [Catarie] error-case: audio HLS 변환 실패, 재생실패 (1) | 2025.09.01 |
| [Catarie 작업일지] 업로드 (0) | 2025.08.27 |
| [Catarie] 영상 소셜 네트워크 프로젝트 - 1. 기획과 설계 (2) | 2025.08.25 |
| [nestJS] 티켓 예약 시스템 구축 - 7 (개선, 완) (3) | 2025.08.02 |