우리가 유튜브에서 영상을 찾아보다면 필요에 따라 영상을 다운받고 싶을때가 있다.
이럴때 제일 무난한거는 온라인에서 유튜브 다운로드 서비스를 지원하는 사이트를 찾아서 이용하는건데, 한번이라도 이 방식을 이용해본 사람이라면 해당 사이트가 참 복잡하다라는 생각이 든다.
그도 그럴께 그 사이트들도 유튜브 다운로드를 목적으로 광고든 뭐든해서 비용을 발생시켜야 하기때문에 순수한 기능으로써의 사이트가 되기는 힘들기 때문이다.
이쯤되면 그냥 내가 직접 프로그램이나 유틸리티로 유튜브를 다운받고 싶어할 것이다.
이를 위해서 알아보니 Mac 사용자라면 brew를 통해 유튜브를 다운로드할 수 있는 프로그램을 설치하고 가동 할 수 있다는걸 알게되어 기록을 남기고자 한다.
선행작업 - Homebrew 설치
당연히 Mac 기반 설명이기때문에 맥이 필수이다.
맥은 애플리케이션, 라이브러리 관리를 Homebrew를 통해 실시한다.
먼저 brew가 설치되어있는지 확인해보자.
~ brew --version
Homebrew 4.3.8Copy만약 설치가 되어있으면 위에처럼 버전이 나올것이다.
설치가 안되어있다면 아래 명령어로 설치를 진행해주자.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Copyyt-dlp 설치
이어서 유튜브를 다운로드 시켜줄 라이브러리를 설치해보자
~ brew install yt-dlpCopy설치가 제대로 되었는지 확인하려면 마찬가지로 아래와 같이 버전 체크를 해보면 된다.
~ yt-dlp --version
2025.01.15Copy또한 yt-dlp는 ffmpeg의 라이브러리를 많이 가져다 쓰기때문에 ffmpeg도 설치후 버전 확인을 해보는것도 필요하다.
# 설치
~ brew install ffmpeg
# 설치 확인 (버전)
~ ffmpeg -versionCopyyt-dlp 사용 방법
사용방법은 매우 간단하다. 기능을 호출해주고 유튜브 영상 링크 주소를 파라미터로 아래와 같이 넘겨주면된다.
~ yt-dlp 'https://www.youtube.com/watch?v=szMxReV-unw'
# 주소를 그대로 복붙하면 아래처럼 특수문자 앞에 역슬래쉬(\)가 들어가는경우도있다. 이럴땐 제거해주자.
# yt-dlp 'https://www.youtube.com/watch\?v\=szMxReV-unw'Copy실제로 위 코드를 실행하면 내 유튜브의 영상을 다운로드되게 해놓았다.
~ yt-dlp 'https://www.youtube.com/watch?v=szMxReV-unw'
[youtube] Extracting URL: https://www.youtube.com/watch?v=szMxReV-unw
[youtube] szMxReV-unw: Downloading webpage
[youtube] szMxReV-unw: Downloading tv player API JSON
[youtube] szMxReV-unw: Downloading ios player API JSON
[youtube] szMxReV-unw: Downloading player 37364e28
[youtube] szMxReV-unw: Downloading m3u8 information
[info] szMxReV-unw: Downloading 1 format(s): 299+251
[download] Destination: 영웅전설 계의 궤적 클리어 인트로 화면 [szMxReV-unw].f299.mp4
[download] 100% of 4.29MiB in 00:00:01 at 2.82MiB/s
[download] Destination: 영웅전설 계의 궤적 클리어 인트로 화면 [szMxReV-unw].f251.webm
[download] 100% of 251.14KiB in 00:00:00 at 618.56KiB/s
[Merger] Merging formats into "영웅전설 계의 궤적 클리어 인트로 화면 [szMxReV-unw].mkv"
Deleting original file 영웅전설 계의 궤적 클리어 인트로 화면 [szMxReV-unw].f251.webm (pass -k to keep)
Deleting original file 영웅전설 계의 궤적 클리어 인트로 화면 [szMxReV-unw].f299.mp4 (pass -k to keep)Copy이런식으로 현재 터미널 위치에 영상이 다운로드된것을 확인할 수 있다.
오디오만 다운로드
만약에 영상에서 오디오만 다운로드하고싶다면 아래와 같이 파라미터를 추가하면된다.
~ yt-dlp --extract-audio --audio-format mp3 'https://www.youtube.com/watch?v=example'Copy최고화질로 다운로드
일반적으로 높은화질우선으로 다운로드되는데, 내가 명시적으로 화질을 최고화질로 받고싶다면 아래 처럼 파라미터를 추가하면 된다.
~ yt-dlp -f best 'https://www.youtube.com/watch?v=example'Copy만약의 위 명령어로 영상과 음성이 분리되거나 음성이 추출이 안되는 경우엔 두가지 해결방법이있다.
yt-dlp -f 'best[ext=mp4]' 'https://www.youtube.com/watch?v=example'Copy일반적으로 유튜브 파일포맷에서 mp4를 이용하면 대부분 영상+음성 합성파일이기때문에 이를 받는 방식이다.
단 이보다 더 높은 화질(영상, 음성 분리)이 있는경우엔 그걸 다운받을 순 없다.
하지만 이보다도 더 고화질을 다운받으려면 어떻게 할까?
yt-dlp -f "bestvideo+bestaudio" --merge-output-format mp4 "https://www.youtube.com/watch?v=l-QhDJoH3J0"Copy보통 해상도 세로 길이가 720이 넘어가는 영상(1920x1080 이상)은 유튜브에서도 최적화를 위해 영상 트랙과 음성 트랙을 분리해서 올려두는데, yt-dlp를 이용해 이 해상도에 해당하는 영상을 받으면 분리된 음성파일은 가져오지 못하는 문제가 발생한다.
이때
-f "bestvideo+bestaudio" 옵션으로 영상과 음성을 모두 가져오고 이를 --merge-output-format mp4 옵션으로 하나의 파일로 묶어주는 명령어를 써야한다.
제보해주신 WW님께 감사의 말씀을 드립니다.
유튜브 영상의 포맷(트랙) 확인
그럼 내가 다운받고싶은 영상이 어떤 화질이 있나 궁금할것이다.
그럴경우에도 yt-dlp로 쉽게 알아볼 수 있다.
yt-dlp -F 'https://www.youtube.com/watch?v=l-QhDJoH3J0' Copy위 명령어로 해당 영상의 포맷을 전체 확인 할 수 있다.
[youtube] l-QhDJoH3J0: Downloading m3u8 information
[info] Available formats for l-QhDJoH3J0:
ID EXT RESOLUTION FPS │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC MORE INFO
─────────────────────────────────────────────────────────────────────────────────────────────
sb3 mhtml 48x27 0 │ mhtml │ images storyboard
sb2 mhtml 80x45 1 │ mhtml │ images storyboard
sb1 mhtml 160x90 1 │ mhtml │ images storyboard
sb0 mhtml 320x180 1 │ mhtml │ images storyboard
233 mp4 audio only │ m3u8 │ audio only unknown Default
234 mp4 audio only │ m3u8 │ audio only unknown Default
602 mp4 256x144 12 │ ~ 2.65MiB 93k m3u8 │ vp09.00.10.08 93k video only
269 mp4 256x144 24 │ ~ 4.78MiB 167k m3u8 │ avc1.4D400C 167k video only
603 mp4 256x144 24 │ ~ 4.79MiB 167k m3u8 │ vp09.00.11.08 167k video only
229 mp4 426x240 24 │ ~ 8.59MiB 300k m3u8 │ avc1.4D4015 300k video only
604 mp4 426x240 24 │ ~ 8.69MiB 304k m3u8 │ vp09.00.20.08 304k video only
230 mp4 640x360 24 │ ~ 21.35MiB 746k m3u8 │ avc1.4D401E 746k video only
605 mp4 640x360 24 │ ~ 18.58MiB 649k m3u8 │ vp09.00.21.08 649k video only
231 mp4 854x480 24 │ ~ 30.38MiB 1062k m3u8 │ avc1.4D401E 1062k video only
606 mp4 854x480 24 │ ~ 33.26MiB 1163k m3u8 │ vp09.00.30.08 1163k video only
232 mp4 1280x720 24 │ ~ 51.68MiB 1806k m3u8 │ avc1.4D401F 1806k video only
609 mp4 1280x720 24 │ ~ 60.53MiB 2116k m3u8 │ vp09.00.31.08 2116k video only
270 mp4 1920x1080 24 │ ~135.40MiB 4733k m3u8 │ avc1.640028 4733k video only
614 mp4 1920x1080 24 │ ~ 91.47MiB 3197k m3u8 │ vp09.00.40.08 3197k video only
616 mp4 1920x1080 24 │ ~161.32MiB 5638k m3u8 │ vp09.00.40.08 5638k video only PremiumCopy이건 실제로 위 영상의 포맷결과인데, 이 영상을 보면 720p를 넘는 해상도가 존재하며 audio only라는 음성 트랙이 있음을 확인할 수 있다.
이런 결과로 해당영상엔 영상과 음성이 분리된 초고화질 트랙이 있다는걸 암시할수있어 다운받을 명령어를 구사할때
-f 'best[ext=mp4]' 를 이용해서 영상+음성 처리된 720p를 받을지,-f "bestvideo+bestaudio" --merge-output-format mp4 를 이용해서 초고화질 영상과 음성을 별도로 받은후 합성처리를 할것인지 결정할 수 있을것이다.특정 해상도로 다운로드
반대로 특정 해상도(예를들어 720p)를 지정하려면 아래와 같이 조정한다.
~ yt-dlp -f 'bestvideo[height<=720]+bestaudio/best' --merge-output-format 'https://www.youtube.com/watch?v=example'Copy특정 확장자로 다운로드
요즘은 유튜브에서 영상 최적화를 위해서 대부분 webm의 확장자 포맷으로 영상이 자동다운로드 된다.
그럴때는 아래와 같이 영상레코딩 명령어를 추가 기술하면 먼저 영상을 다운받은 후 지정한 확장자가 아닐 경우 해당 영상으로 변환하는 작업이 진행된다.
yt-dlp --recode-video mp4 https://www.youtube.com/watch\?v\=exampleCopy경우에 따라서 ffmpeg 패키지가 필요할수도 있는 명령어다.
전체 재생목록 다운로드
만약에 동영상 파일 하나가 아닌 공개된 재생목록의 모든 동영상을 다운로드하려면 아래처럼 재생목록 url로 작동 시키면 된다.
~ yt-dlp -i 'https://www.youtube.com/playlist?list=example'Copy지역 제한, 연령제한, 비공개 컨텐츠 다운로드
만약에 공개 영상이 아닌 모종의 제한이 걸린 컨텐츠를 다운로드하고싶다면 웹사이트에서 유튜브로 로그인되어있는 내 쿠키 데이터를 가져와 이를 기반으로 yt-dlp 으로 다운로드를 요청할 수 있다.
먼저 쿠키데이터를 추출하기위해 크롬이나 파이어폭스에서 아래링크로가 확장프로그램을 설치한다.
Get cookies.txt LOCALLY - Chrome Web Store
Get cookies.txt, NEVER send information outside with open-source
https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc?pli=1

그리고 유튜브에 접속한 이후 확장프로그램을 클릭해 Export 버튼으로 현재 페이지의 쿠키만 추출하던지, 아니면 Export All 로 브라우저의 모든 쿠키를 추출한다.
그러면 cookie.txt 파일이 생성되어 다운로드될텐데 이 파일을 아래처럼 파라미터로 잡은 후 영상 다운로드를 명령어를 요청한다.
~ yt-dlp --cookies /path/to/cookies.txt 'https://www.youtube.com/watch?v=szMxReV-unw'Copy동영상의 일부 구간만 다운로드
댓글로 어느분의 문의를 주셔서 내용을 추가했습니다.
특정 동영상의 일부구간만 추출하듯이 빼내고 싶으면 아래와 같은 명령어로 진행하면 됩니다.
yt-dlp --download-sections "*00:00:10-00:00:20" -f "bv*+ba/b" --merge-output-format mp4 'https://www.youtube.com/watch?v=S90WaAXnFqE'Copy다른명령어랑 특이하네
--download-secetion "*시작시간-종료시간" 이라는 옵션이 있고,두번째로
-f "bv*+ba/v" 라는 파라미터가 있습니다.일부구간만 설정하는 파라미터는 시:분:초 형식으로 요청을 건네는 간단한 부분인데, -f 부분은 좀 생소할것이다.
이건 해당 영상의 포맷을 결정하는건데, 동영상 전체를 받을때는 문제없지만 동영상 일부를 받을때는 영상을 재조립하는 과정에서 지원되지 않는 포맷 문제가 생각보다 많이 발생한다.
그래서 위에처럼 동영상일부를 추출할때는 포맷을 지정하는것이 좋다.
참고로 해당 포맷의 설정값의 뜻은
bv*+ba = best video + best audio 병합을 의미하며, 실패 시 fallback으로 단일 스트림(b)을 사용한다는 의미이다.결론
원천적으로 유튜브는 영상 다운로드 서비스를 지원하고 있지는 않다.
모든 온라인의 기술이 우회 기술이고, 유튜브 페이지가 내놓는 스트리밍 데이터와 영상 데이터를 모아서 파일로 가공해주는 서비스이다.
당연히 유튜브입장에선 이런 트래픽을 감당하기 싫을꺼고 주기적으로 이런 라이브러리 사용을 막기위해 보안 업데이트를 실시하고있다.
만약에 yt-dlp를 깔아둔지 꽤 지났다면 기존 소스코드의 우회 기능이 막혀있는경우가 많아서 오랜만에 사용한다면 이 라이브러리를 업데이트, 업그레이드하고 사용하는걸 권장한다.
끝!
오랜만에 영상 다운로드를 할때 발생하는 문제
다름이 아니라 유튜브는 주기적으로 URL 영상 ID를 암호화 하는 기술을 갱신하는데, 이때마다 yt-dlp도 업그레이드 해줘야 정상적으로 다운로드 작업이 진행된다.
관련된 문제를 최근에 겪어서 아래와 같이 간단하게 문제 해결방법을 정리해보았다.
