본문 바로가기
개발환경/Tips

카카오 TV 1080p 동영상 다운로드: MPEG DASH의 MPD 활용

by Kibua20 2021. 6. 26.
728x170

카카오 Tv에서는 MPEG Dash를 사용해서 동영상 스트리밍 서비스를 지원하고 있습니다. MPEG Dash는 HTTP를 통한 동적 적응 스트리밍을 위한 표준으로 Dynamic Adaptive Streaming over HTTP (DASH)의 약자이며 ISO 표준(ISO/IEC 23009-1)으로 된 HTTP Adaptive Streaming의 한 종류입니다.  다양한 Http Adaptive streaming에 대한 설명을 링크를 참조해주세요. 

 

동영상을 다운로드하는 방법에는 여러 가지 방법이 있으면 관련된 내용은 다음과 같습니다.

youtube-dl 은 유튜브, 네이버, 카카오 Tv를 포함하여 스트리밍 동영상 URL을 기반 동영상을 다운로드하는 오픈 소스로 개발된 툴입니다.  네이버 동영상 streaming은 HLS를 사용해서 확장자가. ts의 작은 동영상을 나눠서 클라이언트로 전송하고 있고,  카카오(다음)는 MPEG Dash 기반으로 확장자가. m4s 파일로 스트리밍 서비스를 하고 있습니다.  [개발환경/Tips] - 카카오 TV 동영상 다운로드: m4s 파일 다운로드 방법에서 설명한 M4S 파일을 다운로드하는 방법은 Audio와 Video 영상을 각각 나눠서 다운로드하고 이를 다시 합치고 ffmpeg으로 다시 변환하는 복잡한 과정을 거쳐야 합니다. 이는 IT 비 전공자가 진행하기에는 다소 어렵게 느낄 수 있고, 실수할 수 있는 부분 또한 많습니다. 

 

본 포스팅은 MPEG Dash 파일을 보다 쉽게 다운로드할 수 있고, 카카오 TV의 경우에는 1080p의 고해상도 동영상까지 다운로드가 가능합니다.   MPEG DASH의 MPD(Media Presentation Description)을 활용하여 youtube-dl로 간편한게 다운로드합니다.

 

MPEG Dash의 MPD(Media Presentation Description) 설명은 www.brendanlong.com/the-structure-of-an-mpeg-dash-mpd.html에 자세하게 설명되어 있습니다.  요약하면 다음과 같습니다.

  • Client에서 필요한 media segment, relationship, metadata를 포함한 스트림의 정보의 나타내는 XML
  • Preiods, Adaptation Sets, Representations, SubReprentation, Media Segments, Index segment로 구성

카카오 TV에서 사용하고 있는 MPD 파일은 아래와 같습니다.  BASE, MAIN, HIGH, LOW 해상도에 대응하고 있는 video 파일과 audio 파일 정보, bandwith, 해상도 (width, height) 정보, codec 정보,  start mumer, duration 등을 포함하고 있습니다. 

카카오 TV 에서 사용하고 있는 MPEG DASH MPD 파일 샘플

 

1. youtube-dl로  MPD 파일 다운로드 

youtube-dl에서는 놀랍게도 MPD 파일 다운로드를 지원하고 있습니다. 사용법은 mpd 파일의 url을 넣고 입력하면 youtube-dl이 audio, video파일을 각각 다운로드하고 ffmpeg으로 파일 하나로 저장해 줍니다.  즉  이전 포스팅에서 설명했던 복잡한 과정을 하나의 명령어로 간편하게 해결 가능합니다.  MPD파일 url은 Chrome의 개발자 메뉴(F10)에서 Network tab에서 '.mpd' 파일로 필터링하면 쉽게 찾을 수 있습니다. 

 

# youtube-dl과 ffmepg 이 설치는 아래 명령어로 가능하고, windows은 경우에는 이전 포스팅을 참고하세요.

$ sudo apt-get install youtube-dl  ffmpeg 

 

# yotube-dl로 mpd 파일 다운로드

$ youtube-dl  {mpd_url}

 

2. youtubd-dl로 MPD 파일 다운로드 시  HTTP 403 Error (Permission) 발생 시 조치 법

MPD 파일로 다운로드할 때 permission error 가 발생하는 경우 아래와 같이 조치할 수 있습니다.  youtube-dl 뿐 아니라 curl로 다운로드하는 경우에도 동일하게 발생합니다.

 

2.1. curl로 mpd 파일 다운로드 에러: Permission Error

명령어:

$ curl http://vsak.play.kakao.com/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd

 

에러 문구:

Access Denied​: You don't have permission to access "http://vsak.play.kakao.com/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd" on this server.

curl 로 mpd 파일 다운로드 에러 문구

 

2.2. youtube-dl로 mpd 파일 다운로드 에러 - Http 403 Error

명령어:

$ youtube-dl https://vsak.play.kakao.com/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd 

 

에러 문구:

[generic] adaptive: Requesting header

WARNING: Could not send HEAD request to https://vsak.play.kakao.com/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd: HTTP Error 403: Forbidden

[generic] adaptive: Downloading webpage

ERROR: Unable to download webpage: HTTP Error 403: Forbidden (caused by <HTTPError 403: 'Forbidden'>); please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output. 

youtube-dl로 mpd 파일 다운로드 에러 문구

 

2.3. MPD 다운로드 시 Permission 문제 해결책

스트리밍 서버에서 인증 정보가 Http Header에 추가됩니다.  curl이나 youtube-dl 명령어 사용 시 Http Header에 인증 정보 없이 request 하여 permission 에러가 발생한 것입니다.  Http Header에 인증 정보는 Chrome의 개발자 메뉴(F12)에서 curl 명령어를 통해서 인증 정보를 확인하고 이를 youtube-dl 실행 시 Header에 추가하면 해결이 가능합니다. 실제 예제로 다시 설명하도록 하겠습니다.

 

  • Http Header에 인증 정보가 없어서 Permission 에러 발생
  • Chrome 개발자 메뉴에서 동영상의 인증 정보를 얻어와서 youtube-dl 실행 시 추가

 

 

3. 카카오 TV 1080p 동영상을 youtube-dl로 MPD 활용하여 다운로드

카카오 TV의 동영상을 sample을 기반으로 실제 영상을 다운로드할 수 있는 예제를 설명하겠습니다.  카카오 TV  동영상에서 MPD 파일의 URL의 curl 명령어를 확인하고 이를 youtube-dl 명령어로 변환합니다. 각각의 단계는 아래와 같습니다. 

 

3.1. 동영상 URL 정보 및 curl명령어 확인

  1. 카카오 TV에서 동영상의 해상도를 선택 (youtube-dl에서는 기본 값으로 고해상도를 다운로드합니다.)
  2. Chrome 개발자 메뉴의 Network Tab에서 확장자가 '.mpd' 파일을 필터링. 만일 mpd 파일이 없다면 동일한 페이지를 다시 접속하면 됩니다.
  3. 확장자가 mpd 파일 (adaptive.mpd)을 선택하고 마우스 오른쪽 클릭
  4. 마우스 오른쪽 메뉴에서 Copy 메뉴 선택
  5. Copy all as cURL 선택

카카오 TV 1080p 동영상을 youtube-dl로 MPD 활용하여 다운로드

 

Copy all cURL 실행하고 텍스트 에디터를 열어서 복사합니다.  해당 동영상 web page에 서버와 주고받은 내용의 curl 명령어 형태로 모두 기록되어 있고 이 중에서 'adaptive.mpd'를 을 다운로드했던 curl 명령어를 찾습니다.  curl 명령어 내용을 보면 User agent와 함께 authority, cookie (hash code)와 같은 서버 인증 정보가 그대로 포함되어 있습니다. 일반적으로 access token을 일정 시간만 유효하기 때문에 1시간 이상이 지났다면 다시 curl 명령어의 header를 다시 받아야 합니다. 

'adaptive.mpd' 파일의 curl 명령어

 

3.2. curl 명령어를 youtube-dl 명령어로 변경

'adaptive.mpd' 파일의 curl 명령어 부분을 그대 복사하고 아래와 대소문자를 구분하여 replace 같이 치환합니다. 

 

curl 명령어를 youtube-dl 명령어로 치환:

  •  curl  →  youtube-dl
  •   -H  →  --add-header
  • --compress → 삭제

 curl 명령어를 youtube-dl 명령어로 변경

 

 

$ youtube-dl 'https://vsak.play.kakao.com/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd' \

  --add-header  'authority: vsak.play.kakao.com' \

>   --add-header  'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' \

>   --add-header  'accept: */*' \

>   --add-header  'origin: https://tv.kakao.com' \

>   --add-header  'sec-fetch-site: same-site' \

>   --add-header  'sec-fetch-mode: cors' \

>   --add-header  'sec-fetch-dest: empty' \

>   --add-header  'referer: https://tv.kakao.com/' \

>   --add-header  'accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7' \

>   --add-header  'cookie: cdn-auth=dummy=start~px-time=1609865695~px-hash=79becad39981131f7c1f93b3171d0c37~access=/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd~px-path=/vod/rvnn.....e/vhs/plain/~dummy=end; webid=b1......a8; webid_ts=1595932955124; TIARA=dBM.......HU6; kd_lang=ko; _ga=GA1.2.1929599765.1598012071; _kadu=zc1-Ors0-AkpHJmT_1607518654831; _T_ANO=NGIX0OnFmT(....중략...)H9fzF4bbCbsU+Q=='

youtube-dl로 mpd 다운로드 실행 결과

[generic] adaptive: Requesting header

WARNING: Falling back on generic information extractor.

[generic] adaptive: Downloading webpage

[generic] adaptive: Extracting information

[dashsegments] Total fragments: 339

[download] Destination: adaptive-adaptive.fHIGH4.mp4

[download] 100% of 981.96MiB in 00:41

[dashsegments] Total fragments: 339

[download] Destination: adaptive-adaptive.f128-44100.m4a

[download] 100% of 21.13MiB in 00:13

[ffmpeg] Merging formats into "adaptive-adaptive.mp4"

Deleting original file adaptive-adaptive.fHIGH4.mp4 (pass -k to keep)

Deleting original file adaptive-adaptive.f128-44100.m4a (pass -k to keep)

 

youtube-dl로 다운로드 실행 결과

 

yotube-dl의 실행 옵션 (Audio 파일만 다운로드)

yotube-dl을 실행 옵션은 기본 값으로 bestvideo+bestaudio 옵션으로 설정되어 있습니다.  만일 Audio 파일만 사용한다면 '-k'을 추가하고 daptive-adaptive.f128-44100.m4a 파일을 사용하면 됩니다. 

 

# Audio 파일을 삭제하지 않는 경우 

$ youtube-dl -k --format 'bestvideo+bestaudio' --output ".//%(title)s.%(ext)s" 'https://vsak.play.kakao.com/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd' \

  --add-header  'authority: vsak.play.kakao.com' \

  --add-header  'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' \

  --add-header  'accept: */*' \

  --add-header  'origin: https://tv.kakao.com' \

  --add-header  'sec-fetch-site: same-site' \

  --add-header  'sec-fetch-mode: cors' \

  --add-header  'sec-fetch-dest: empty' \

  --add-header  'referer: https://tv.kakao.com/' \

  --add-header  'accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7' \

  --add-header  'cookie: cdn-auth=dummy=start~px-time=1609865695~px-hash=79becad39981131f7c1f93b3171d0c37~access=/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd~px-path=/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/~dummy=end; webid=b11d....bbCbsU+Q=='

 

※ 윈도우 Command 창에서는 \ 대신 ^ 를 입력하면 여러 줄의 명령어를 입력 가능합니다. Text Editor에서 앞에서 설명한 youtube-dl의 --add-header을 복사하고 \ 대신 ^ 로 변경하여 Clip Board에 복사하고 Command 창에 붙여넣기하기 하면 여러 줄의 명령어가 입력됩니다. 

youtube-dl -k --format 'bestvideo+bestaudio' --output ".//%(title)s.%(ext)s" 'https://vsak.play.kakao.com/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd' ^
  --add-header  'authority: vsak.play.kakao.com' ^
  --add-header  'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' ^
  --add-header  'accept: */*' ^
  --add-header  'origin: https://tv.kakao.com' ^
  --add-header  'sec-fetch-site: same-site' ^
  --add-header  'sec-fetch-mode: cors' ^
  --add-header  'sec-fetch-dest: empty' ^
  --add-header  'referer: https://tv.kakao.com/' ^
  --add-header  'accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7' ^
  --add-header  'cookie: cdn-auth=dummy=start~px-time=1609865695~px-hash=79becad39981131f7c1f93b3171d0c37~access=/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/adaptive.mpd~px-path=/vod/rvnn6msiunapt8axziyeiq8oe/vhs/plain/~dummy=end; webid=b11d....bbCbsU+Q=='

 

 

다운로드 동영상 확인

카카오 TV에서 다운로드한 동영상을 코덱 정보를 보면 H264 MPEG4 AVC (Part 10) 1920x1080 해상도, 30 fps임을 알 수 있고, Audio파일은 44hz dml AAC codec입니다.

카카오 TV 1080p 동영상 확인

 

관련 글:

[개발환경/Tips] - Spotify 한국에서 사용하는 방법

[개발환경/Tips] - 광고 없는 Android 토렌트 앱: LibreTorrent

[모바일 SW 개발/REST API] - 라이딩 앱 Strava API 사용해보기: Webhook 구현

[모바일 SW 개발/REST API] - 외부 망에서 Localhost를 접속하기: ngrok (일부 무료)

[모바일 SW 개발/REST API] - 외부 망에서 Localhost를 접속하기: localtunnel (무료, domain제공)

[모바일 SW 개발/REST API] - 자주 사용하는 curl 명령어 옵션과 예제

[모바일 SW 개발/REST API] - 무료 REST API 테스트 프로그램: Postman (설치, 활용법)

[모바일 SW 개발/REST API] - 공공 데이터 Open API 사용법: 코로나 확진자 현황 API (sample code)

[개발환경/Web Server] - Website 전체 백업 방법: HTTrack (티스토리 백업에 활용)

[개발환경/Tips] - Youtube 다운로드 방법 (광고 없는 오픈 소스 기반 tool 사용)

[개발환경/Tips] - 네이버 동영상 다운로드 방법 (동영상과 설명 포함)

[블로그 관리/티스토리 블로그 관리] - 초보자를 위한 티스토리 블로그 애드센스 광고 설정 방법

[개발환경/Tips] - 카카오 TV 동영상 다운로드: m4s 파일 다운로드 방법

[개발환경/Tips] - ffmepg 에러: trun track id unknown, no tfhd was found

[개발환경/우분투] - Ubuntu 동영상 플레이어: VLC Player 설치

그리드형



댓글42

  • Favicon of https://yorocoromj.tistory.com BlogIcon 요로코롬J 2021.01.09 18:46 신고

    좋은 정보네요! 잘 보고 가요!!
    답글

  • brr 2021.01.18 13:28

    감사합니다. 403에러때문에 못받고 있네요 ㅎㅎㅎㅎ
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.01.18 18:25 신고

      curl 명령어를 youtube-dl 명령어로 치환하고 해보세요. mdp 파일으로만 실행하면 403 ( Permission error 납니다.)

      curl → youtube-dl
      -H → --add-header
      --compress → 삭제

  • Player 2021.02.10 12:33

    이 방법으로는 유료 영상 다운로드 가능한가요...?
    답글

  • test 2021.02.14 22:30

    이거 패치된건가요?
    지금 우분투에서 curl 부분을 복사할때 끝부분에 kadu 까지는 잘나오는데 _T_ANO 부분이 없어 430에러가나는것 같습니다.
    같은 환경으로 맥에서 복사할때는 'user-agent: 정보까지나오고 그이후는 정보가 안나오네요 이부분 혹시 어떻게 해결해야할까요?
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.02.14 22:48 신고

      특별하게 patch나 변경은 없습니다. 제가 방금 우분투에서 확인했을때 _T_ANO 까지 잘 나옵니다. 브라우저는 크롬입니다.

      youtube-dl로 adatvie.mpd파일 다운로드 시 cookie: 를 내용은 삭제해도 403 에러가 나는지요?

      맥은 제가 환경이 없어서 확인이 어럽습니다.

  • 익명 2021.03.30 22:41

    비밀댓글입니다
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.03.31 00:48 신고

      마이크로 소프트 사이트가 이렇게 사용하고 있어요 다운 가능밥니다.

    • 익명 2021.03.31 18:52

      비밀댓글입니다

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.03.31 19:01 신고

      수작업으로 합치는 것은 https://kibua20.tistory.com/130 에 설명되어 있습니다.

      youtube-dl을 사용하시는 것이 더 편리합니다.

      youtube-dl {mpd_url} 이렇게 하면 자동으로 video/audio segment 를 합쳐 파일 하나로 만들어줍니다. youtube-dl를 사용하신 것 맞는지요?

    • 익명 2021.03.31 21:08

      비밀댓글입니다

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.03.31 21:26 신고

      확장자를 mp4나 .ts로 변경 후 플레이어로 읽어보세요. 아님 url을 알려주시면 테스트해볼깨요

  • 익명 2021.06.11 06:26

    비밀댓글입니다
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.06.12 20:13 신고

      로그인에서 email address와 패스워드를 다시 묻네요.

      공개 영상을 확인하니 ts 파일로 curl로 다운로드하고 합치시면 됩니다.

      하지만 ID/Pass 입력 후 확인하는 영상은 어떻게 될지 모르겠네요. 유료 영상은 대부분 DRM 걸려 있고 이 경우 Key 가 없으면 다운로드 불가합니다.

  • 익명 2021.06.14 09:20

    비밀댓글입니다
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.06.16 21:44 신고

      말씀해주신 사이트에서 확인을 했습니다. 동영상 파일 자체는 DRM 걸려 있어 다운로드하더라도 Play가 안됩니다.

      동영상을 Play하고 화면/소리 캡쳐해야 합니다.

      * 다운로드 동영상 Header확인:
      Encryption : Encrypted

    • BlogIcon 속절 2021.06.17 05:57

      알려주셔서 감사드립니다

  • 속절 2021.06.25 23:15

    안녕하세요, 윈도우 커멘드라인 명령줄에서 youtube-dl에 --add-header 옵션을 어떻게 넣어야 하는지요?
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.06.26 14:19 신고

      Text 에디터에서 youtube 명령어를 복사하고 \ 대신 ^ 를 사용하면 Cmd창 (명령어 프롬프트)에서 붙여넣기하면 여러 줄 입력 가능합니다.

  • 익명 2021.07.04 23:52

    비밀댓글입니다
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.07.05 07:05 신고

      쿼리 파라미터 추가하는 것이 맞고요. 티빙은 저도 안해봤는데 테스트 해보고 말씀드리도록 할깨요

  • 눈나 2021.07.04 23:56

    근데 여기 비밀댓글로 쓰면..내가 쓴 글 확인 못하나요? ㅠ
    위에 비댓으로 질문쓴거..수정좀 할려고 보려했는데..아예 볼수가 없네요..
    답글

  • 익명 2021.07.06 02:52

    비밀댓글입니다
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.07.07 18:22 신고

      제가 이번주 바뻐서 못 보고 있어요. 담주 중에 확인하고 공유드릴깨요.

    • 익명 2021.07.08 06:54

      비밀댓글입니다

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.07.12 13:50 신고

      말씀하신 사이트는 구독이 필요한 URL이라 동일한 콘턴츠는 확인을 못했습니다. 티빙의 다른 무료 VoD를 확인해보니 DRM 이 걸려 있습니다.

      유료 VoD도 DRM 걸려있을 것 같은데요. DRM 이 걸려 있으면 다운로드 가능하더라도 key를 알아야 합니다.

  • 1121 2021.07.22 18:54

    혹시 mpd파일을 영상으로 변환하는 과정이 이 글 내용인가요? 도무지 이해를 할 수가 없어서 해외영상을 다운받았는데 확장명이 mpd이고 나머지는 mp4인데 소리만 나오도록 되어있더군요 혹시 이러한 현상에 대해서 알고계신것이 있는지 궁금합니다
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.07.22 19:55 신고

      mpd 스트리밍은 음성과 영상이 별도로 다운로드합니다. 음성 영상 각각 다운로드 후 합쳐야해요.

  • 익명 2021.08.05 10:06

    비밀댓글입니다
    답글

    • Favicon of https://kibua20.tistory.com BlogIcon Kibua20 2021.08.06 16:14 신고

      확인해보니. mpd 파일의 링크가 401 Authorization Required 에러 납니다. youtube-dl이나 curl 로 우회 다운로드 가능한 방법이 있을 것 같은데 찾아봐야 할 것 같습니다.

      mpd 파일 대신에 m4s 파일을 그대로 받아서 합쳐야 할 것 같습니다. m4s파일은 접근이 가능합니다. 아래 링크 확인해주세요.

      https://kibua20.tistory.com/130

  • 익명 2021.08.27 16:53

    비밀댓글입니다
    답글

  • 익명 2021.09.09 21:08

    비밀댓글입니다
    답글

  • ㅅㄷㄴㅅ 2021.11.16 21:28

    혹시 Cc(자막) 도 다운이 가능한가요??
    답글

  • 2022.01.13 18:05

    안녕하세요, 유료 브이라이브(네이버) 영상을 다운로드 하려고 방법을 찾아보다가 선생님 글을 발견하게 됐습니다. network 읽어보니까 init은 mp4, 나머지 seg는 m4s, 그리고 stream.mpd가 하나 뜹니다. m4s 다운을 받거나 mpd 다운을 받거나 둘 중 하나를 해야할 것 같은데, m4s를 다운로드 후 mp4로 변환할 때 Invalid data found when processing input 에러가 나고, mpd로 다운로드를 하려면 no video formats found 에러가 뜹니다. 이건 아무래도 DRM 때문일까요? 혹시 유료 콘텐츠 구매한 계정이 있다면 drm 걸린 파일도 다운받을 수 있는 방법이 있는지 궁금합니다.
    답글

  • 익명 2022.04.05 23:14

    비밀댓글입니다
    답글