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

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

by Kibua20 2021. 6. 26.

카카오 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 설치




댓글