스트리밍 서비스를 이용하거나 온라인 비디오를 시청한 적이 있다면, 배후에서 중요한 역할을 하는 M3U8 파일을 간접적으로 접했을 가능성이 높습니다. 이 글에서는 M3U8 파일이 무엇인지, 어떻게 작동하는지, 그리고 현대 비디오 스트리밍에서 왜 중요한지 자세히 알아보겠습니다.
M3U8이란 무엇인가?
M3U8은 멀티미디어 재생 목록을 정의하는 텍스트 파일 형식으로, 특히 HTTP 라이브 스트리밍(HLS) 프로토콜에서 핵심적인 역할을 합니다. 이름에서 알 수 있듯이, 이 파일은 두 가지 요소로 구성됩니다:
- M3U: "MP3 URL" 또는 "Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator"의 약자로, 오디오 파일의 재생 목록을 정의하는 파일 형식입니다.
- 8: UTF-8 인코딩을 사용한다는 것을 나타냅니다. 이를 통해 다양한 언어와 특수 문자를 지원할 수 있습니다.
M3U8 파일의 구조
M3U8 파일은 기본적으로 텍스트 파일이므로 일반 텍스트 편집기로 열어 내용을 확인할 수 있습니다. 아래는 간단한 M3U8 파일의 예시입니다:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.9,
segment1.ts
#EXTINF:9.9,
segment2.ts
#EXTINF:9.9,
segment3.ts
#EXTINF:9.9,
segment4.ts
#EXT-X-ENDLIST
이 M3U8 파일은 다음과 같은 주요 요소로 구성됩니다:
- #EXTM3U: 이 파일이 M3U 확장 파일임을 나타내는 헤더입니다.
- #EXT-X-VERSION: 사용 중인 HLS 프로토콜 버전을 지정합니다.
- #EXT-X-TARGETDURATION: 각 미디어 세그먼트의 최대 지속 시간(초)을 지정합니다.
- #EXT-X-MEDIA-SEQUENCE: 첫 번째 세그먼트의 시퀀스 번호를 지정합니다.
- #EXTINF: 다음 세그먼트의 지속 시간을 나타냅니다.
- 세그먼트 파일명: 실제 미디어 콘텐츠가 저장된 파일 경로(.ts 파일)입니다.
- #EXT-X-ENDLIST: 스트림의 끝을 나타냅니다(VOD 콘텐츠에만 있음).
HTTP 라이브 스트리밍(HLS)과 M3U8
M3U8 파일은 Apple에서 개발한 HTTP 라이브 스트리밍(HLS) 프로토콜의 핵심 구성 요소입니다. HLS는 오디오 및 비디오 콘텐츠를 HTTP를 통해 스트리밍하기 위한 프로토콜로, 다음과 같은 특징이 있습니다:
- 적응형 비트레이트 스트리밍: 네트워크 상태에 따라 비디오 품질을 동적으로 조정합니다.
- 세그먼트화: 콘텐츠를 작은 세그먼트로 나누어 전송합니다.
- 폭넓은 호환성: iOS, Android, 웹 브라우저 등 다양한 플랫폼에서 지원됩니다.
HLS 스트리밍에서 M3U8 파일은 두 가지 주요 유형으로 사용됩니다:
1. 마스터 재생 목록 (Master Playlist)
여러 품질의 스트림을 정의하는 상위 M3U8 파일입니다. 클라이언트는 네트워크 상태에 따라 적절한 품질을 선택할 수 있습니다.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360
low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=842x480
medium/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720
high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
hd/index.m3u8
이 마스터 재생 목록은 네 가지 다른 품질의 스트림을 제공하고 있으며, 각각 다른 해상도와 대역폭을 가지고 있습니다.
2. 미디어 재생 목록 (Media Playlist)
실제 미디어 세그먼트 파일을 가리키는 M3U8 파일입니다. 마스터 재생 목록에서 선택된 품질에 해당하는 미디어 재생 목록이 사용됩니다.
M3U8의 주요 기능과 태그
M3U8 파일에는 스트리밍 동작을 제어하는 다양한 태그가 있습니다. 자주 사용되는 태그들을 살펴보겠습니다:
기본 태그
태그 설명
#EXTM3U | M3U8 파일의 시작을 나타냅니다 |
#EXTINF | 다음 세그먼트의 지속 시간과 제목을 지정합니다 |
#EXT-X-ENDLIST | 스트림의 끝을 나타냅니다 (VOD에만 사용) |
버전 및 호환성 태그
태그 설명
#EXT-X-VERSION | HLS 프로토콜 버전을 지정합니다 |
#EXT-X-INDEPENDENT-SEGMENTS | 각 세그먼트가 독립적으로 디코딩 가능함을 나타냅니다 |
타이밍 및 시퀀스 관련 태그
태그 설명
#EXT-X-TARGETDURATION | 최대 세그먼트 지속 시간을 지정합니다 |
#EXT-X-MEDIA-SEQUENCE | 첫 번째 세그먼트의 시퀀스 번호를 지정합니다 |
#EXT-X-DISCONTINUITY | 타임라인 불연속성을 나타냅니다 |
#EXT-X-PROGRAM-DATE-TIME | 세그먼트의 절대 시간을 지정합니다 |
적응형 스트리밍 관련 태그
태그 설명
#EXT-X-STREAM-INF | 대체 스트림의 특성을 지정합니다(해상도, 대역폭 등) |
#EXT-X-MEDIA | 대체 렌디션을 지정합니다(언어, 자막 등) |
암호화 및 DRM 관련 태그
태그 설명
#EXT-X-KEY | 콘텐츠 암호화에 사용되는 키 정보를 지정합니다 |
라이브 스트리밍 vs VOD(주문형 비디오)
M3U8 파일은 라이브 스트리밍과 VOD 모두에 사용되지만, 동작 방식에 약간의 차이가 있습니다:
라이브 스트리밍
라이브 M3U8 파일:
- #EXT-X-ENDLIST 태그가 없습니다.
- 클라이언트가 주기적으로 M3U8 파일을 다시 로드하여 새 세그먼트를 확인합니다.
- 이전 세그먼트는 시간이 지남에 따라 목록에서 제거됩니다.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1234
#EXTINF:9.9,
segment1234.ts
#EXTINF:9.9,
segment1235.ts
#EXTINF:9.9,
segment1236.ts
VOD(Video On Demand)
VOD M3U8 파일:
- #EXT-X-ENDLIST 태그로 끝납니다.
- 모든 세그먼트가 미리 생성되어 있습니다.
- 파일이 변경되지 않습니다.
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:9.9,
segment0.ts
#EXTINF:9.9,
segment1.ts
#EXTINF:9.9,
segment2.ts
#EXT-X-ENDLIST
M3U8과 TS 파일의 관계
M3U8 파일이 재생 목록을 정의한다면, 실제 비디오 콘텐츠는 어디에 있을까요? HLS에서는 비디오 콘텐츠를 일반적으로 MPEG-2 Transport Stream(TS) 파일로 저장합니다.
- TS 파일: 비디오, 오디오, 자막 등을 담고 있는 실제 미디어 콘텐츠 세그먼트입니다.
- M3U8 파일: 이러한 TS 파일의 위치와 재생 순서를 지정합니다.
최신 버전의 HLS에서는 fMP4(분할된 MP4) 세그먼트도 지원하며, 이 경우 파일 확장자가 .m4s가 될 수 있습니다.
M3U8 파일 생성 및 서빙
M3U8 파일과 비디오 세그먼트를 생성하기 위한 여러 도구와 방법이 있습니다:
FFmpeg을 사용한 M3U8 생성
FFmpeg은 비디오 파일을 HLS 형식으로 변환하는 데 널리 사용되는 도구입니다:
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8
이 명령은 입력 비디오를 10초 길이의 세그먼트로 나누고 index.m3u8 파일을 생성합니다.
여러 품질의 스트림 생성
적응형 스트리밍을 위해 여러 품질의 스트림을 생성할 수 있습니다:
# 낮은 해상도 (360p)
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls low/index.m3u8
# 중간 해상도 (480p)
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 842x480 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls medium/index.m3u8
# 높은 해상도 (720p)
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 1280x720 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls high/index.m3u8
# HD 해상도 (1080p)
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 1920x1080 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls hd/index.m3u8
그런 다음 마스터 재생 목록을 수동으로 만들어야 합니다.
클라우드 서비스 활용
AWS MediaConvert, Azure Media Services, Google Cloud Transcoder와 같은 클라우드 서비스를 사용하여 HLS 스트림을 생성할 수도 있습니다.
M3U8 파일 재생하기
M3U8 파일을 재생하기 위한 여러 옵션이 있습니다:
웹 플레이어
- HLS.js: JavaScript 라이브러리로, HLS를 네이티브로 지원하지 않는 브라우저에서도 HLS 재생을 가능하게 합니다.
const video = document.getElementById('video');
const videoSrc = '<a href=https://example.com/master.m3u8';>https://example.com/master.m3u8';</a>
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource(videoSrc);
hls.attachMedia(video);
}
else if (video.canPlayType('application/vnd.apple.mpegurl')) {
// 네이티브 HLS 지원이 있는 경우 (Safari)
video.src = videoSrc;
}
- Video.js: 널리 사용되는 오픈 소스 비디오 플레이어로, HLS 재생을 지원합니다.
- JW Player, Flowplayer: 상용 비디오 플레이어로, HLS 재생을 지원합니다.
네이티브 앱
- iOS: Safari 및 AVPlayer가 HLS를 네이티브로 지원합니다.
- Android: ExoPlayer 라이브러리를 통한 HLS 재생이 일반적입니다.
- 데스크톱: VLC, QuickTime과 같은 미디어 플레이어가 M3U8 파일 재생을 지원합니다.
실전 문제 해결 팁
크로스 오리진 문제
HLS 스트림을 제공할 때 CORS(Cross-Origin Resource Sharing) 헤더를 설정해야 할 수 있습니다:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, HEAD, OPTIONS
Access-Control-Allow-Headers: Range
Access-Control-Expose-Headers: Date, Server
올바른 MIME 타입 설정
웹 서버에서 M3U8 및 TS 파일에 대한 올바른 MIME 타입을 설정해야 합니다:
- M3U8 파일: application/vnd.apple.mpegurl 또는 application/x-mpegURL
- TS 파일: video/mp2t
Nginx 설정 예시:
http {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
}
콘텐츠 전송 네트워크(CDN) 활용
HLS 스트리밍의 성능을 향상시키기 위해 CDN을 사용하는 것이 좋습니다. 많은 CDN 제공업체가 HLS를 지원합니다:
- Cloudflare
- Akamai
- Amazon CloudFront
- Fastly
결론
M3U8 파일은 현대 비디오 스트리밍의 중요한 구성 요소로, 적응형 스트리밍을 가능하게 하고 다양한 네트워크 환경과 디바이스에서 원활한 비디오 재생 경험을 제공합니다. 텍스트 기반의 단순한 형식이지만, 비디오 스트리밍의 복잡한 요구 사항을 처리할 수 있는 유연성을 제공합니다.
Netflix, YouTube, Disney+와 같은 주요 스트리밍 서비스들이 HLS를 포함한 적응형 스트리밍 기술을 사용하고 있으며, 이는 M3U8 파일 형식의 중요성을 보여줍니다. 비디오 스트리밍을 구현하거나 최적화하려는 개발자라면 M3U8 파일 형식과 HLS 프로토콜에 대한 이해가 필수적입니다.
이 가이드를 통해 M3U8 파일의 기본 개념부터 고급 기능까지 이해하고, 자신의 프로젝트에 적용할 수 있기를 바랍니다.