본문으로 건너뛰기

코스모스 LMS에서 강의 영상 다운로드하기 - m3u8, ffmpeg, yt-dlp

· 약 7분
L4N14KE4
Student

코스모스 LMS의 hls 스트리밍 강의 영상을 m3u8 주소로 다운로드해보자.

hls-download.png

TL;DR​

코스모스 강의 영상은 우클릭 저장이 안 되고, 개발자 도구를 열어봐도 mp4 대신 .m3u8과 .ts 파일만 보인다.

원인: 영상이 hls 스트리밍으로 잘게 쪼개져 전송된다.

해결: 브라우저 확장 FetchV로 받는 게 가장 간단하다. 명령어가 익숙하다면 개발자 도구에서 .m3u8 주소를 복사해 ffmpeg나 yt-dlp로 받아도 된다.


서론​

강의 영상을 STT로 전사해서 복습 자료로 쓰고 싶었다. 그런데 영상에서 우클릭을 해도 저장 메뉴가 없었고, 개발자 도구를 열어 mp4 파일을 찾아봐도 .m3u8과 .ts 파일만 보였다.

devtools-m3u8.webp

index.m3u8 하나와 segment-1-v1-a1.ts, segment-2-v1-a1.ts... 같은 조각 파일이 줄줄이 받아지고 있었다.

우리 학교 LMS인 코스모스(Coursemos)는 오픈소스 LMS인 무들(Moodle)을 바탕으로 만들어졌다. 무들은 업로드한 영상을 파일 그대로 내려주는데, 우리 학교 코스모스는 강의 영상을 별도의 스트리밍 서버에서 hls 방식으로 보내주고 있었다.

코스모스에도 교수자가 영상 다운로드를 켜고 끄는 설정이 있을 텐데, 기본값이 꺼짐으로 되어 있는 것 같다. 그래서 학생 화면에는 다운로드 버튼이 없고, 영상도 스트리밍으로만 볼 수 있는 것으로 보인다.

1. hls 스트리밍이란?​

HTTP Live Streaming의 약자로, 애플이 만든 스트리밍 프로토콜이다.1 영상 하나를 몇 초짜리 조각으로 나눠 보내고, 네트워크 상태에 맞는 화질의 조각을 골라 재생한다.

  • .m3u8: 재생 목록 파일. 어떤 조각을 어떤 순서로 재생할지 적혀 있다.
  • .ts: 실제 영상이 담긴 조각 파일.

.m3u8 파일을 열어보면 이렇게 생겼다.

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10.0,
segment0.ts
#EXTINF:10.0,
segment1.ts
...
#EXT-X-ENDLIST

즉, .m3u8 주소만 알면 목록에 있는 .ts 조각을 전부 받아 하나의 영상으로 합칠 수 있다. 아래 방법들은 모두 이 원리로 동작한다.

경고

강의 영상은 저작권이 교수자와 학교에 있다. 다운로드 전에 이용 약관을 확인하고, 받은 영상은 개인 학습용으로만 쓰자. 무단 배포나 공유는 법적으로 문제가 될 수 있다.

2. 방법 1: 브라우저 확장 (FetchV)​

명령어 없이 클릭 몇 번이면 받을 수 있어서, 대부분은 이 방법이면 충분하다. FetchV는 페이지에서 재생 중인 m3u8 영상을 감지해 mp4로 합쳐 저장해준다.

1단계: 설치​

크롬 웹 스토어의 FetchV 페이지에서 Chrome에 추가를 누른다.

설치 후 퍼즐 아이콘에서 FetchV를 고정해두면 편하다. 크로미움 기반 브라우저(Edge, Whale, Brave, Vivaldi 등)에서도 설치 가능하다.

2단계: 다운로드​

코스모스에서 강의 영상을 재생한 뒤 확장프로그램 툴바의 FetchV 아이콘을 누르면 감지된 index.m3u8이 보인다. 재생하지 않으면 감지되지 않으니 꼭 먼저 재생하자. Download를 누른다.

fetchv-popup.webp

새 탭에서 다운로드 페이지가 열리고 조각을 받기 시작한다. 화질과 파일 이름도 여기서 바꿀 수 있다. 100%가 되면 초록색 저장 버튼을 눌러 파일로 저장한다.

fetchv-download.webp

경고

다운로드가 끝날 때까지 이 탭을 닫으면 안 된다. 받은 조각을 이 탭이 들고 있다가 하나로 합치기 때문이다. 그리고 100%가 되어도 저장 버튼을 누르기 전까지는 파일이 저장되지 않는다.

다른 선택지: Coursemos Downloader​

찾아보다가 이름부터 코스모스용인 확장을 하나 더 발견했다. 대학·기업 온라인 강의 플랫폼에서 재생되는 영상을 감지해 MP4나 M4A로 저장해준다고 한다.

다만 이 확장은 직접 사용해보지는 않았다.

3. 방법 2: 명령어로 직접 받기​

확장을 설치하기 싫거나, 명령어가 익숙하다면 명령어로 받으면 된다. 먼저 .m3u8 주소를 찾아야 한다.

1단계: m3u8 주소 찾기​

  1. 코스모스에서 강의 영상 페이지를 연다.
  2. F12(Mac은 Command + Option + I)로 개발자 도구를 열고 Network(네트워크) 탭으로 이동한다.
  3. 필터 입력창에 m3u8을 입력한다.
  4. 영상을 재생하면 .m3u8 요청이 나타난다. 우클릭 → Copy → Copy URL로 주소를 복사한다.

요청을 클릭하면 서론의 화면처럼 Headers 탭의 Request URL에서도 주소를 볼 수 있다.

팁
  • 아무것도 안 뜨면 개발자 도구를 켜둔 채로 새로고침(F5) 후 다시 재생한다.
  • .m3u8이 여러 개 보이면 화질별 목록이 있는 것이다. 어느 것을 넣어도 되고, 화질 목록(master)을 넣으면 도구가 가장 좋은 화질을 알아서 고른다.
  • 주소 뒤에 붙은 토큰은 시간이 지나면 만료된다. 복사한 뒤 바로 받자.

2단계-A: ffmpeg로 받기​

ffmpeg는 영상·음성을 변환하는 명령줄 도구다. m3u8 주소를 넣으면 조각을 받아 하나의 파일로 합쳐준다.

설치

# Mac (Homebrew)
brew install ffmpeg

# Windows (PowerShell)
winget install Gyan.FFmpeg

Windows는 설치 후 터미널을 새로 열어야 명령어가 인식된다. 설치가 됐는지 확인한다.

ffmpeg -version

다운로드

ffmpeg -i "m3u8_주소" -c copy 강의.mp4
  • -i "m3u8_주소": 입력으로 쓸 m3u8 주소. & 같은 문자가 섞여 있으니 따옴표로 감싸야 한다.
  • -c copy: 다시 인코딩하지 않고 조각을 그대로 이어 붙인다. 화질 손실이 없고 빠르다.
  • 강의.mp4: 저장할 파일 이름.

2단계-B: yt-dlp로 받기​

yt-dlp는 유튜브를 비롯한 여러 사이트의 영상을 받는 명령줄 도구다. 원래는 youtube-dl을 많이 썼지만 업데이트가 사실상 멈춰서, 지금은 이를 이어받은 yt-dlp를 쓴다.2 사용법은 youtube-dl과 같고, m3u8 주소를 넣으면 화질을 골라 받아준다.

설치

# Mac (Homebrew)
brew install yt-dlp

# Windows (PowerShell)
winget install yt-dlp.yt-dlp

yt-dlp는 받은 조각을 mp4로 합칠 때 ffmpeg를 쓰기 때문에 ffmpeg도 함께 설치되어 있어야 한다.

yt-dlp --version

다운로드

yt-dlp "m3u8_주소" -o 강의.mp4
  • "m3u8_주소": 다운로드할 m3u8 주소.
  • -o 강의.mp4: 저장할 파일 이름. 생략하면 m3u8 파일 이름으로 저장된다.

받기 전에 어떤 화질이 있는지 보고 싶다면 -F를 붙인다.

yt-dlp -F "m3u8_주소"

목록 맨 앞의 ID를 -f로 넣으면 그 화질로 받는다. 예를 들어 yt-dlp -f 720 "m3u8_주소"처럼 쓴다.

실제 실행 화면은 4. (선택) 테스트해보기에서 볼 수 있다.

403 에러가 날 때​

브라우저에서는 재생되는데 명령어로는 403 Forbidden이 뜬다면, 서버가 "어디서 요청했는지"를 확인하는 경우다. 개발자 도구에서 m3u8 요청을 클릭해 Request Headers의 Referer 값을 복사해 같이 넣어준다.

# ffmpeg: -headers는 -i 보다 앞에 와야 한다
ffmpeg -headers "Referer: 복사한_Referer" -i "m3u8_주소" -c copy 강의.mp4

# yt-dlp
yt-dlp --referer "복사한_Referer" "m3u8_주소" -o 강의.mp4

4. (선택) 테스트해보기​

강의 영상으로 바로 받기 전에 공개된 테스트 m3u8로 명령어가 잘 동작하는지 먼저 확인해볼 수 있다. Mux에서 제공하는 Big Buck Bunny(약 10분) 스트림이다.

테스트 방법 펼치기

1단계: ffmpeg로 테스트​

테스트이니 앞 10초만 받아보겠다. -hide_banner를 붙이면 맨 앞의 긴 버전 정보가 빠져서 다운로드 과정만 보인다.

# -t 10 → 앞 10초만
ffmpeg -hide_banner -i "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" -t 10 -c copy ffmpeg-test.mp4

.ts 조각을 하나씩 열어(Opening '...ts' for reading) 받으면서, 아래 frame= ... time= 줄의 시간이 00:00:10까지 올라간다.

ffmpeg-test.webp

2단계: yt-dlp로 테스트​

먼저 화질 목록을 확인한다. 240p부터 1080p까지 다섯 가지가 나온다.

yt-dlp -F "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"

가장 작은 240p(약 20MB)로 영상 전체를 받아보자.

yt-dlp -f 240 "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" -o ytdlp-test.mp4

Total fragments: 64로 m3u8에 적힌 조각이 64개라는 것을 알려주고, 받는 동안에는 (frag 30/64)처럼 몇 번째 조각을 받고 있는지 보여준다. 다 받으면 100% of 21.38MiB가 뜨고, [FixupM3u8] 단계에서 ffmpeg로 mp4 파일을 정리한다.

ytdlp-test.webp

3단계: 결과 확인​

폴더에 mp4 파일 두 개가 생겼다. ffmpeg로 받은 파일은 1920×1080 10초(약 5.5MB), yt-dlp로 받은 파일은 240p 10분(약 20MB)이다.

test-result-finder.webp

5. 받은 영상 활용하기​

나는 이렇게 받은 강의 영상을 Alt 같은 STT 서비스에 넣어 텍스트로 전사한 뒤 복습 자료로 활용했다.

alt-transcribe.webp

결론​

코스모스 강의 영상에서 mp4가 안 보인다면 hls 스트리밍이기 때문이다. .m3u8 주소만 찾으면 된다.

  • 가장 간단한 방법: FetchV 확장으로 재생 중인 영상을 바로 받기
  • 명령어로 직접: 개발자 도구에서 .m3u8 주소 복사 → ffmpeg 또는 yt-dlp로 받기

복습하려고 강의를 다시 볼 때가 있는데, 나는 교수님의 강의를 전사해서 나중에 글로 다시 보는 편이다. 그동안은 스트리밍으로만 볼 수 있어서 아쉬웠는데, 이제 영상을 받아 전사까지 할 수 있는 좋은 방법을 찾은 것 같아 만족스럽다.

Footnotes​

  1. HTTP Live Streaming - Apple Developer, https://developer.apple.com/streaming/ (접근: 2026.10.01) [아카이브] ↩

  2. yt-dlp/yt-dlp - GitHub, https://github.com/yt-dlp/yt-dlp (접근: 2026.10.06) [아카이브] ↩