M3U
동영상은 하나도 들어 있지 않은 텍스트 파일, 그런데 그게 바로 IPTV 구독의 정체다.
M3U는 이름이 붙은 미디어 주소를 나열한 순수 텍스트 목록입니다. 오디오나 동영상은 전혀 담고 있지 않습니다. IPTV 제공업체가 구독을 팔 때 실제로 건네주는 건 바로 이런 목록 중 하나로 가는 링크입니다 — 채널 이름, 로고, 그룹, 스트림 주소가 나열되어 있고, 플레이어가 이를 채널 가이드로 바꿔줍니다.
2026년 7월 30일
별도 앱 없이 열리는지
iOS나 macOS의 그 무엇도 M3U를 재생목록으로 읽어내지 못합니다. 하나를 탭하면 그냥 텍스트 벽이 나타납니다. 이건 미디어 형식이 아니라서 어떤 시스템도 이걸 그렇게 취급하도록 만들어지지 않았습니다 — 이 목록이 *무엇을 위한 것인지* 이해하는 앱이 따로 필요합니다.
핵심 정보
| 정식 명칭 | MP3 URL, 혹은 Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator |
|---|---|
| 종류 | 재생목록 — 주소 목록일 뿐 미디어는 없음 |
| 확장자 | .m3u(어떤 텍스트 인코딩이든), .m3u8(UTF-8) |
| 공개 | 1990년대 후반, Winamp를 위해 Fraunhofer가 만듦; 공식 표준화된 적은 없음 |
| 구조 | 각 항목의 이름을 적는 #EXTINF 줄 다음, 그 주소가 이어짐 |
| IPTV 확장 태그 | tvg-id, tvg-name, tvg-logo, group-title — 사양이 아니라 관례로 추가됨 |
| 주소가 가리키는 곳 | 보통 HLS 재생목록이나 MPEG-TS 스트림; 가끔은 평범한 파일 |
| 제공업체별 일반적인 크기 | 채널 수십만 개짜리 목록이면 수백 KB부터 200MB를 훌쩍 넘는 경우까지 |
이름과 주소의 목록
이 형식은 형식이라고 부르기 민망할 만큼 단순합니다. 각 항목은 두 줄입니다 — 그 대상의 이름을 적는 #EXTINF로 시작하는 줄 하나와, 그것이 있는 주소를 적는 줄 하나. 그 밖의 모든 것 — 로고, 채널 번호, 플레이어에서 카테고리가 되는 그룹 정보 — 은 나중에 사람들이 #EXTINF 줄에 임의로 붙이기 시작한 속성들로, 어떤 표준화 기구도 이를 공인한 적이 없습니다.
이런 비공식성 때문에 M3U 파일마다 편차가 큽니다. 어떤 제공업체는 group-title="Sports"라고 쓰고, 다른 곳은 group-title="SPOR"라고 쓰고, 세 번째 곳은 아예 생략하고 플레이어가 알아서 추측하길 기대합니다. IPTV를 잘 다루는 플레이어란 결국 형편없이 만들어진 M3U 파일을 숱하게 겪어본 플레이어입니다.
M3U8과의 혼동은 짚고 넘어갈 가치가 있습니다 — 여기서 8은 그냥 UTF-8 텍스트 인코딩을 뜻할 뿐, 그 이상은 아닙니다. 모든 HLS 재생목록은 M3U8이지만, 모든 M3U8이 HLS인 것은 아닙니다 — UTF-8로 저장된 IPTV 채널 목록도 .m3u8이고, 이건 세그먼트 스트리밍과는 아무 관계가 없습니다.
크기가 왜 모든 문제의 원인인가
제공업체의 목록은 이 형식이 전혀 예상치 못한 방식으로 커져 버렸습니다. 2010년만 해도 몇백 줄짜리였던 파일이, 이제 큰 제공업체 기준으로는 수십만 개의 항목과 수백 메가바이트의 텍스트가 되었습니다.
이걸 읽는 가장 단순한 방법 — 파일 전체를 메모리로 불러오고, 파싱하고, 결과를 계속 들고 있는 방식 — 은 그보다 훨씬 전에 이미 무너집니다. 200MB짜리 목록을 이런 식으로 파싱하면 iPhone이 도저히 버티지 못할 메모리 스파이크가 생기고, iOS는 기다려주지 않고 그냥 앱을 종료해 버립니다. 수많은 IPTV 앱이 대형 제공업체의 목록만 만나면 그냥 죽어버리는 이유가 여기 있습니다.
실제로 통하는 방식은 목록을 아예 통째로 들고 있지 않는 것입니다 — 디스크에서 조금씩 읽어서, 파싱되는 대로 각 채널을 바로 데이터베이스에 기록하고, 화면은 그 데이터베이스에서 페이지 단위로 불러오는 것이죠. FoxDL은 채널 200만 개, 485MB짜리 목록으로 측정해 봤습니다 — 가져오는 데 123초, 추가로 쓴 메모리는 9MB, 첫 화면을 그리는 데 4밀리초, 목록 전체를 검색하는 데 400밀리초가 걸렸습니다. 이 숫자들이 흥미로운 이유는 단순한 방식으로는 애초에 이런 결과 자체가 나올 수 없기 때문입니다.
M3U 다루는 법
- 파일이 아니라 URL로 추가하기
제공업체는 목록을 계속 갱신합니다 — 채널이 옮겨지고 주소가 바뀝니다. URL을 그대로 들고 있는 플레이어는 새로고침할 수 있지만, 한 번 내려받은 사본을 들고 있는 플레이어는 뭔가 바뀌는 순간 바로 낡은 정보가 되어버립니다.
- 그룹 정보가 엉망일 걸 각오하고 검색 기능 쓰기
카테고리 이름은 전적으로 제공업체가 정하는 것이라 어떤 규칙도 따르지 않습니다. 큰 목록에서는 앱이 메모리에 올려둔 배열이 아니라 데이터베이스를 검색하는 방식이라면, 채널을 직접 찾아 들어가는 것보다 검색하는 편이 더 빠릅니다.
- 목록이 곧 콘텐츠는 아니라는 점 기억하기
M3U는 그저 주소들의 나열입니다. 그 주소를 시청하는 게 합법인지 여부는 파일이나 플레이어가 아니라 그 제공업체에 관한 질문입니다. 어떤 앱도 채널을 직접 제공하지 않고, 사용자가 직접 넣은 목록을 보증해 줄 수도 없습니다.