m3u8 / HLS 스트림 다운로드하는 방법: 완벽 가이드 2026
m3u8이 무엇인지, HLS 스트림을 병합해야 하는 이유, MP4로 저장하는 3가지 실용적인 방법을 배우세요.
다운로드하고 싶은 영상을 찾았습니다. Chrome의 Network 탭을 열고 재생을 눌렀더니 .m3u8 URL로의 요청이 보입니다. 이제 어떻게 할까요? 해당 URL에서 다운로드할 수 있는 파일은 영상이 아니라 204바이트 텍스트 파일입니다. 실제 영상은 그 안에 참조된 수백 개의 작은 .ts 파일들입니다. HLS에 오신 것을 환영합니다 — 2026년에 대부분의 라이브 및 온디맨드 동영상을 지원하는 스트리밍 프로토콜입니다.
이 가이드는 HLS가 실제로 무엇인지, “m3u8 다운로드”가 URL 복사보다 더 복잡한 이유, 그리고 초보자부터 고급 사용자까지 세 가지 실용적인 방법을 설명합니다.
HLS와 m3u8이 무엇인가요?
HLS는 HTTP Live Streaming의 약자입니다. Apple이 2009년에 특수한 스트리밍 서버 없이 표준 HTTP 연결을 통해 동영상을 스트리밍하는 방법으로 만들었습니다. 이제 웹에서 동영상의 지배적인 프로토콜이 되었습니다 — 방송 네트워크, 주문형 동영상 플랫폼, 라이브 스트림, 임베디드 강의, 그리고 대부분의 광고 지원 영상이 이를 사용합니다.
핵심은 HLS “영상”이 단일 파일이 아니라는 것입니다. 다음으로 구성됩니다:
.m3u8확장자를 가진 플레이리스트 파일 (기본적으로 UTF-8 텍스트)- 미디어 세그먼트 목록 — 보통
.ts파일(MPEG transport stream) 또는.m4s프래그먼트(fragmented MP4) — 보통 각각 2-10초 길이 - 때로는 자체 오디오 세그먼트를 가진 별도의 오디오 플레이리스트
- 때로는 자막 플레이리스트
브라우저의 동영상 플레이어는 플레이리스트를 로드하고, 순서대로 세그먼트를 다운로드하며, 시청할 때 실시간으로 연결합니다. “m3u8을 다운로드”할 때, 당신은 목차만 다운로드한 것입니다.
m3u8 파일에 실제로 무엇이 포함되어 있나요?
일반적인 미디어 플레이리스트는 다음과 같습니다:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
segment000.ts
#EXTINF:10.0,
segment001.ts
#EXTINF:9.5,
segment002.ts
#EXT-X-ENDLIST
각 #EXTINF 줄은 다음 세그먼트의 지속 시간을 선언합니다. 끝의 #EXT-X-ENDLIST은 이것이 VOD(주문형 동영상)임을 표시합니다. 라이브 스트림의 경우, 해당 줄이 없고 매니페스트는 몇 초마다 새로운 세그먼트가 추가됩니다.
마스터 플레이리스트는 한 단계 위에 있으며 다양한 품질의 여러 미디어 플레이리스트를 가리킵니다:
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,RESOLUTION=720x480
480p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,RESOLUTION=1280x720
720p/playlist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080
1080p/playlist.m3u8
최신 마스터 플레이리스트는 또한 별도의 오디오 매니페스트, 별도의 자막 매니페스트, 때로는 대체 동영상 스트림(HDR, 다양한 코덱)을 참조합니다. 오디오/동영상 분리에 대한 자세한 내용은 HLS 다운로드 오디오와 동영상이 분리되어 있나요? 해결 방법을 참조하세요.
”단순히 m3u8을 다운로드하고 mp4로 이름 바꾸기”가 작동하지 않는 이유
이것은 가장 흔한 실수입니다. .m3u8 파일은 텍스트이고, 이름을 바꾸어도 그 내용은 변경되지 않습니다. 당신은 204바이트의 텍스트 파일을 가지고 있습니다. 어떻게든 플레이어가 그것을 섭취하게 했다 하더라도, 그것은 세그먼트 URL을 가져오려고 시도할 것인데, 이것은 정확히 원래 플레이어가 이미 하고 있던 작업입니다.
HLS 스트림을 재생 가능한 MP4로 바꾸려면 다음을 수행해야 합니다:
- 마스터 플레이리스트 해석 → 원하는 품질 선택 → 해당 미디어 플레이리스트 가져오기
- 미디어 플레이리스트에 나열된 모든 세그먼트 가져오기 (수백 개의 파일일 수 있음)
- 스트림이 암호화된 세그먼트를 사용하는 경우(AES-128 또는 SAMPLE-AES), 복호화 키를 가져오고 들어올 때마다 각 세그먼트를 복호화합니다
- 순서대로 세그먼트 연결하기
- 오디오와 동영상이 별도의 매니페스트에 있으면, 위의 모든 작업을 두 번 병렬로 수행하고 결과를 병합합니다
- 연결에 의해 도입된 타임스탬프 문제 해결하기
- 결과를 MP4 컨테이너로 래핑하기 (또는 일부 용도로는
.ts로 유지)
이것은 수동으로 수행하고 싶지 않은 충분한 작업입니다. 아래는 이를 위임하는 3가지 방법입니다.
방법 1: Chrome 확장 프로그램 (명령줄 없음)
동영상 플레이어와 같은 탭에서 실행되는 브라우저 확장 프로그램은 다음을 할 수 있습니다:
- 플레이어가 로드하는 마스터 플레이리스트를 볼 수 있습니다
- 플레이어의 인증을 상속받습니다 (쿠키, 헤더, 서명된 URL)
- 오디오 및 동영상 매니페스트를 분리할 때 자동으로 쌍을 이룹니다
- AES-128 복호화를 투명하게 처리합니다
- FFmpeg.wasm을 통해 브라우저에서 결과를 단일 MP4로 혼합합니다
Video Downloader One-for-All은 이 목적으로 우리가 유지하는 확장 프로그램입니다. 워크플로우는 다음과 같습니다:
- Chrome Web Store에서 설치하고 도구 모음에 고정합니다
- HLS 콘텐츠가 있는 페이지를 방문하면, 확장 프로그램은 플레이어가 로드할 때 매니페스트를 자동으로 감지합니다
- 확장 프로그램 아이콘을 클릭합니다 — 콘텐츠가 감지되면 도구 모음 배지가 파란색으로 변합니다
- 드롭다운에서 품질을 선택합니다
- 다운로드 클릭합니다
HLS의 전체 기능 표면은 HLS downloader 페이지에 있습니다. 확장 프로그램이 뒤에서 무엇을 하는지에 대한 기술적 컨텍스트는 이 가이드가 장문 동반입니다.
방법 2: yt-dlp (명령줄, 일괄 친화적)
yt-dlp는 미디어 URL을 섭취하고 기본 스트림을 자동으로 해석하는 Python CLI입니다. 일괄 작업, 스크립팅 및 파이프라인에 탁월합니다. 설치합니다:
# macOS
brew install yt-dlp
# pip
pip install yt-dlp
그런 다음 HLS 스트림을 다운로드합니다:
yt-dlp "https://example.com/path/to/master.m3u8"
최고 품질의 병합된 오디오 및 동영상의 경우:
yt-dlp -f "bv*+ba/b" --merge-output-format mp4 "https://example.com/master.m3u8"
-f "bv*+ba/b" 선택자는 “최고의 동영상 스트림 + 최고의 오디오 스트림, 최고의 단일 결합 스트림으로 폴백”을 의미합니다. 이것은 별도의 오디오/동영상 매니페스트를 자동으로 처리합니다.
yt-dlp가 잘 작동하는 경우:
- 인증 벽이 없는 공개 VOD
- yt-dlp의 추출기 라이브러리가 구체적으로 지원하는 사이트 (수천 개 나열됨)
- URL 목록에서의 일괄 다운로드
yt-dlp가 어려움을 겪는 경우:
- 인증된 브라우저 세션이 필요한 스트림
- 공격적인 Cloudflare 또는 토큰 회전 벽 뒤의 사이트
- 라이브 스트림 (yt-dlp는 라이브 HLS를 기록할 수 있지만 안정성은 다양함)
- TLS 지문 감지가 있는 사이트
이 모든 경우, 브라우저 확장 프로그램은 브라우저의 세션을 상속받기 때문에 더 안정적입니다.
방법 3: FFmpeg (한 줄, 가장 낮은 수준)
FFmpeg는 m3u8 URL을 직접 처리할 수 있습니다:
ffmpeg -i "https://example.com/master.m3u8" -c copy output.mp4
이것은 다음과 같은 경우에 작동합니다:
- 마스터 플레이리스트에 인증 없이 도달할 수 있습니다
- 오디오가 동영상 세그먼트에 혼합됩니다 (구형 HLS 스트림)
- CDN이 특수한 헤더를 요구하지 않습니다
별도의 오디오와 동영상을 가진 최신 스트림의 경우, 두 매니페스트를 모두 지정해야 합니다:
ffmpeg \
-i "https://example.com/video/1080p/playlist.m3u8" \
-i "https://example.com/audio/eng/playlist.m3u8" \
-c copy \
-bsf:a aac_adtstoasc \
output.mp4
CDN이 Referer 헤더를 요구하는 경우 (Bilibili, 일부 일본 방송사, 많은 임베디드 플레이어의 경우 일반적):
ffmpeg \
-headers "Referer: https://example.com/video-page" \
-i "https://cdn.example.com/master.m3u8" \
-c copy \
output.mp4
FFmpeg는 가장 유연한 도구이지만 가장 까다로운 도구입니다. 종종 DevTools에서 URL을 찾고, 올바른 헤더를 설정하고, 만료되는 토큰을 처리하고, 스트림이 회전하면 다시 실행해야 합니다. 일회성 포렌식에는 좋지만 일일 사용에는 고통스럽습니다.
m3u8 URL을 찾는 방법
페이지가 직접 다운로드 링크를 노출하지 않으면 (거의 모두 그렇지 않음), DevTools에서 m3u8 URL을 찾습니다:
- Chrome에서 동영상 페이지를 엽니다
- F12 또는 Cmd+Option+I를 눌러 DevTools를 엽니다
- Network 탭을 클릭합니다
- 필터 상자에
m3u8을 입력합니다 - 동영상에서 재생을 클릭합니다
- 네트워크 로그는 하나 이상의
.m3u8URL에 대한 요청을 표시합니다 - 첫 번째 것 (종종
master.m3u8또는playlist.m3u8이라고 불림)이 마스터 플레이리스트입니다 - 마우스 오른쪽 단추 → 복사 → URL 복사
여러 m3u8 요청을 보면, 첫 번째는 보통 마스터이고, 후속은 품질별 미디어 플레이리스트입니다. 마스터가 FFmpeg/yt-dlp에 원하는 것입니다. 확장 프로그램은 이 해석을 자동으로 수행합니다.
일반적인 HLS 문제
m3u8 URL이 60초 후 만료됩니다
많은 CDN은 단시간 만료(전형: 60-300초)로 URL에 서명합니다. URL을 복사하고 5분 후에 시도하면, 403을 받습니다. 해결책: 브라우저에서 페이지를 새로 고쳐 새 URL을 받거나, 브라우저 컨텍스트에서 실행되는 도구를 사용합니다.
세그먼트는 AES-128 암호화를 사용합니다
매니페스트에 #EXT-X-KEY:METHOD=AES-128,URI="key.bin"이 표시됩니다. 세그먼트는 암호화되어 있으며 복호화하려면 키가 필요합니다. yt-dlp와 FFmpeg이 자동으로 처리합니다. 구형 브라우저 확장 프로그램은 그렇지 않습니다 — 암호화된 바이트를 다운로드하고 재생 불가능한 파일을 생성합니다.
스트림이 SAMPLE-AES를 사용합니다 (DRM 유사)
#EXT-X-KEY:METHOD=SAMPLE-AES가 보이면, 암호화는 부분적입니다 — 각 세그먼트 내의 특정 샘플만 암호화되고, 전체 세그먼트는 아닙니다. 이것은 더 정교한 처리가 필요합니다. yt-dlp이 대부분의 경우를 다룹니다. 일부 사이트 (FairPlay, Widevine HLS)는 DRM 시스템을 통해서만 사용 가능한 키가 필요합니다 — 이것들은 합법적으로 다운로드할 수 없으며 우리는 지원하지 않습니다.
라이브 스트림이 몇 분 후 중단됩니다
라이브 HLS 매니페스트는 슬라이딩 윈도우입니다 — 가장 최근 ~30-60초의 세그먼트만 포함합니다. FFmpeg를 한 번 가리키고 그대로 두면, 매니페스트가 회전하고 다운로드가 중단됩니다. 라이브 녹음의 경우, 새 세그먼트가 나타날 때 매니페스트를 계속 다시 가져오는 도구가 필요합니다. 우리 확장 프로그램의 live recorder가 이를 수행합니다. FFmpeg는 -live_start_index 플래그로 할 수 있지만 구성이 복잡합니다.
다운로드한 파일은 재생되지만 오디오가 없습니다
오디오/동영상 매니페스트 분리 문제가 있습니다 — 오디오/동영상 분할 동반 문서에서 다룹니다. 동영상 매니페스트만이 아니라 두 매니페스트를 모두 병합해야 합니다.
비교: 어느 방법을 언제 사용할 것인가
| 상황 | 최고의 도구 |
|---|---|
| 공개 사이트에서의 호기심 어린 일회성 다운로드 | 온라인 m3u8-to-mp4 도구 |
| 브라우저의 사이트에서의 반복적인 다운로드 | Chrome 확장 프로그램 |
| 이미 가지고 있는 많은 URL에 대한 배치 스크립트 | yt-dlp |
| 스트림이 당신의 로그인 세션이 필요합니다 | Chrome 확장 프로그램 |
| 라이브 스트림 녹음 | Chrome 확장 프로그램 또는 라이브 플래그가 있는 FFmpeg |
| 외래 인증 뒤의 스트림 (커스텀 JWT, mTLS) | 커스텀 헤더가 있는 FFmpeg |
| 교육적 / 프로토콜 자체 디버깅 | FFmpeg + DevTools |
Stream Recorder가 더 이상 정답이 아닌 이유
Stream Recorder를 읽고 있는 이유는, Chrome Web Store의 가장 설치된 HLS 확장 프로그램이 더 이상 재생 가능한 파일을 생성하지 않기 때문입니다 — 이것은 별도의 이야기입니다. Stream Recorder는 2025-08-01 이후로 업데이트를 받지 못했고, 현대의 오디오/동영상 매니페스트 분리가 이를 깹니다. 우리는 이것을 Stream Recorder 2026년에 작동하지 않습니까? 최고의 HLS/m3u8 대안에서 자세히 다루었습니다.
결론
m3u8은 동영상 세그먼트를 가리키는 텍스트 파일일 뿐입니다. “m3u8 다운로드”는 동영상이 아니라 목차를 제공합니다. 재생 가능한 파일을 얻으려면 세그먼트를 가져오고, 암호화되면 복호화하고, 분리되면 오디오를 동영상과 병합하고, MP4로 혼합해야 합니다.
대부분의 사람들에게, Chrome 확장 프로그램은 브라우저를 떠나지 않고 모든 것을 자동화합니다. 해당 사용 사례에 맞으면 Video Downloader One-for-All 설치하세요. 일괄 CLI 작업의 경우, yt-dlp가 탁월합니다. 수술적 제어의 경우, FFmpeg를 사용합니다.
세 가지 각각에 자리가 있습니다. 피해야 할 실수는 m3u8 파일을 동영상인 것처럼 취급하는 것입니다.