HLS
애플 형님들이 미디어 스트리밍 프로토콜을 만들었다
영상을 업로드하는 시점에 용량이 큰 비디오를 여러 개의 비디오 세그먼트(.ts, 보통 8~10초 단위)로 분할 및 메타데이터(.m3u8)로 트랜스코딩하여 업로드한다.
시청자는 http 요청을 기반으로 메타데이터 및 비디오 세그먼트를 연속적으로 요청하여 동영상을 재생하게 된다.
m3u8
- Master Playerlist: 전체적인 비디오의 메타데이터
#EXTM3U #EXTINF:10.0, http://example.com/segment1.ts #EXTINF:10.0, http://example.com/segment2.ts #EXTINF:10.0, http://example.com/segment3.tsShow⯆
- Media Playlist: 각 세그먼트에 대한 메타데이터
#EXTM3U #EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=640x360 low_bandwidth.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720 medium_bandwidth.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5120000,RESOLUTION=1920x1080 high_bandwidth.m3u8Show⯆- 먼가 해상도, 비트레이트 같은 게 다닥다닥 붙어 있는데 Adaptive Bitrate Streaming을 위한 것
장단점
- stateless - 로드밸런싱, 스케일 아웃 등등등이 용이해짐
- 이 장점 하나가 무지막지하게 크다
- 업로드 코스트. 아무래도 단일 파일을 쪼개서 트랜스코딩해야 할테니 여기에 소요되는 프로세싱 파워가 있을 것
- 실시간의 경우 레이턴시가 높음
- 대안: Low Latency HLS?
개발자 도구 까보기
귀여운 댕댕이 영상이 hls로 날아가는 걸 개발자 도구로 까보았다
Content-Type: application/vnd.apple.mpegurl
request body에 m3u8이 왔다
Content-Type: application/octet-stream
매 요청마다 비디오 세그먼트를 가져온다
넷플릭스도 쓰는가보다 안 쓸 리가 없지
m3u8은 잘 숨겨놓은 것인지 못찾았다. 추측컨대 개발자도구에서 안보이게 어느정도 암호화? 걸 수도 있는 듯
여담
유튜브는 UMP라고 하는 MIME? 파일 포맷?을 쓰는 듯한데 검색하려니 웬 기관단총만 잔뜩 나와서 검색을 포기했다;;