개발

Mac 터미널로 유튜브 다운로드 하기 (yt-dlp)

우리가 유튜브에서 영상을 찾아보다면 필요에 따라 영상을 다운받고 싶을때가 있다.
이럴때 제일 무난한거는 온라인에서 유튜브 다운로드 서비스를 지원하는 사이트를 찾아서 이용하는건데, 한번이라도 이 방식을 이용해본 사람이라면 해당 사이트가 참 복잡하다라는 생각이 든다.

그도 그럴께 그 사이트들도 유튜브 다운로드를 목적으로 광고든 뭐든해서 비용을 발생시켜야 하기때문에 순수한 기능으로써의 사이트가 되기는 힘들기 때문이다.

이쯤되면 그냥 내가 직접 프로그램이나 유틸리티로 유튜브를 다운받고 싶어할 것이다.
이를 위해서 알아보니 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)"Copy



yt-dlp 설치

이어서 유튜브를 다운로드 시켜줄 라이브러리를 설치해보자

~ brew install yt-dlpCopy

설치가 제대로 되었는지 확인하려면 마찬가지로 아래와 같이 버전 체크를 해보면 된다.

~ yt-dlp --version
2025.01.15Copy

또한 yt-dlp는 ffmpeg의 라이브러리를 많이 가져다 쓰기때문에 ffmpeg도 설치후 버전 확인을 해보는것도 필요하다.

# 설치
~ brew install ffmpeg

# 설치 확인 (버전)
~ ffmpeg -versionCopy


yt-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 FPSFILESIZE   TBR PROTOVCODEC          VBR ACODEC     MORE INFO
─────────────────────────────────────────────────────────────────────────────────────────────
sb3 mhtml 48x27        0mhtmlimages                         storyboard
sb2 mhtml 80x45        1mhtmlimages                         storyboard
sb1 mhtml 160x90       1mhtmlimages                         storyboard
sb0 mhtml 320x180      1mhtmlimages                         storyboard
233 mp4   audio onlym3u8audio only          unknown    Default
234 mp4   audio onlym3u8audio only          unknown    Default
602 mp4   256x144     12 │ ~  2.65MiB   93k m3u8vp09.00.10.08   93k video only
269 mp4   256x144     24 │ ~  4.78MiB  167k m3u8avc1.4D400C    167k video only
603 mp4   256x144     24 │ ~  4.79MiB  167k m3u8vp09.00.11.08  167k video only
229 mp4   426x240     24 │ ~  8.59MiB  300k m3u8avc1.4D4015    300k video only
604 mp4   426x240     24 │ ~  8.69MiB  304k m3u8vp09.00.20.08  304k video only
230 mp4   640x360     24 │ ~ 21.35MiB  746k m3u8avc1.4D401E    746k video only
605 mp4   640x360     24 │ ~ 18.58MiB  649k m3u8vp09.00.21.08  649k video only
231 mp4   854x480     24 │ ~ 30.38MiB 1062k m3u8avc1.4D401E   1062k video only
606 mp4   854x480     24 │ ~ 33.26MiB 1163k m3u8vp09.00.30.08 1163k video only
232 mp4   1280x720    24 │ ~ 51.68MiB 1806k m3u8avc1.4D401F   1806k video only
609 mp4   1280x720    24 │ ~ 60.53MiB 2116k m3u8vp09.00.31.08 2116k video only
270 mp4   1920x1080   24 │ ~135.40MiB 4733k m3u8avc1.640028   4733k video only
614 mp4   1920x1080   24 │ ~ 91.47MiB 3197k m3u8vp09.00.40.08 3197k video only
616 mp4   1920x1080   24 │ ~161.32MiB 5638k m3u8vp09.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


전체 재생목록 다운로드

만약에 동영상 파일 하나가 아닌 공개된 재생목록의 모든 동영상을 다운로드하려면 아래처럼 재생목록 url로 작동 시키면 된다.

~ yt-dlp -i 'https://www.youtube.com/playlist?list=example'Copy


지역 제한, 연령제한, 비공개 컨텐츠 다운로드

만약에 공개 영상이 아닌 모종의 제한이 걸린 컨텐츠를 다운로드하고싶다면 웹사이트에서 유튜브로 로그인되어있는 내 쿠키 데이터를 가져와 이를 기반으로 yt-dlp 으로 다운로드를 요청할 수 있다.

먼저 쿠키데이터를 추출하기위해 크롬이나 파이어폭스에서 아래링크로가 확장프로그램을 설치한다.

Get cookies.txt LOCALLY - Chrome Web Store
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를 깔아둔지 꽤 지났다면 기존 소스코드의 우회 기능이 막혀있는경우가 많아서 오랜만에 사용한다면 이 라이브러리를 업데이트, 업그레이드하고 사용하는걸 권장한다.
끝!

#유용한사이트
10 개의 댓글
라니 3달 전 대댓글
좋은 정보 감사합니다. 근데 다운받고 설치 확인을 했는데 권한거부라고 뜨네요 혹시 해결방법 알려주실수 있을까요!!
에루샤 3달 전 대댓글
@라니
안녕하세요, 라니님!
yt-dlp 다운로드 중 권한문제라면 영상이 다운로드되는 폴더에 쓰기권한이 없는 문제라 디렉토리 권한을 chmod로 확인하시거나 -P 파라미터로 영상 다운로드 패스를 명시적으로 지정하는 방법이 있습니다.
(관련 링크: https://askubuntu.com/questions/1409609/yt-dlp-permission-denied-error)
이런 문제가 아니라 최초에 yt-dlp 설치과정에서 버전확인 단계의 권한 문제라면 "패키지 매니저인 brew 의 쓰기문제"일 수 있습니다.
이 문제는 "brew permission denied"로 구글검색하시면 쉽게 찾아볼 수있습니다.
(관련링크 1: https://velog.io/@nohsangwoo/Homebrew-Permission-denied,
관련링크 2:https://anywaydevlog.tistory.com/64)
아무쪼록 문제 잘 해결되시길 바랍니다. 꾸벅
라니 3달 전 대댓글
감사합니다!! 보고 잘따라해볼게요 :)
WW 2주 전 대댓글
안녕하세요. 잘 설명해주신 덕분에 잘 따라했습니다. 혹시 동영상 전체를 다운받는거 말고 동영상의 일부분 부분만 다운받는 명령어도 있을까요?
그리고 ~ yt-dlp -f 'bestvideo[height<=720]+bestaudio/best' 'https://www.youtube.com/watch?v=example'
이 명령어로만 최대 화질이 받아지고
~ yt-dlp -f best 'https://www.youtube.com/watch?v=example' 이걸로는 낮은 화질만 받아지는데 문제는 최대화질로 받은 영상이 오디오와 영상 파일이 분리되어있어서 써먹지 못하네요.. 어떻게하면 좋을까요?
에루샤 2주 전 대댓글
@WW
안녕하세요, WW님!
필요하신 부분에 대한 정보를 게시글 내부에 추가해놓았습니다.
- 동영상 일부분 다운로드: https://erulabo.com/298#heading-10
- 최대화질 영상+음성 다운로드 및 합성: https://erulabo.com/298#heading-5
좋은 질문 남겨주셔서 글 내용이 덕분에 더 풍성해진것 같습니다.
감사합니다. 좋은하루 되세요!
술래잡기 1일 전 대댓글
Last login: Fri May 9 15:30:38 on ttys000
my계정@Jangsangwonui-MacBookPro ~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
==> Checking for `sudo` access (which may request your password)...
Password:
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew

Press RETURN/ENTER to continue or any other key to abort:
==> /usr/bin/sudo /usr/sbin/chown -R my계정:admin /opt/homebrew
==> Downloading and installing Homebrew...
==> Updating Homebrew...
Warning: /opt/homebrew/bin is not in your PATH.
Instructions on how to configure your shell for Homebrew
can be found in the 'Next steps' section below.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
술래잡기 1일 전 대댓글
Read the analytics documentation (and how to opt-out) here:
https://docs.brew.sh/Analytics
No analytics data has been sent yet (nor will any be during this install run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
https://github.com/Homebrew/brew#donations

==> Next steps:
- Run these commands in your terminal to add Homebrew to your PATH:
echo >> /Users/my계정/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/my계정/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
https://docs.brew.sh

my계정@Jangsangwonui-MacBookPro ~ % ~ brew install yt-dlp
zsh: permission denied: /Users/my계정
my계정@Jangsangwonui-MacBookPro ~ %

중간에 보면 설치가 성공했다고 나오는데 이후로는 yt-dlp 설치도 안됩니다. 뭐가 문제일까요?
에루샤 1일 전 대댓글
@술래잡기
brew 설치는 제대로 하셨는데, 이후에 yt-dlp 설치 명령어를 잘못입력하신것 같습니다.
~를 뺀 brew install yt-dlp 요 명령어만 입력하면 설치되지않을까 싶네요!

만약에 이 문제가 아니라면 brew 설치후 PATH 작업이 안되어있을수 있습니다.
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
를 입력하시고 그 이후에
brew install yt-dlp
를 입력하시면 될거 같습니다.
술래잡기 5시간 전 대댓글
말씀해 주신대로 했더니 잘 됩니다. 감사합니다^^ 그런데 멤버십 회원전용 영상은 다운을 받을 수 없나요? 꼭! 필요한 영상을 다운받고 싶은데 쿠키데이타를 다운 받아 실행해 보았는데 에러가 뜨네요. 아래와 같이요. 방법이 있을까요?

[youtube] Extracting URL: https://www.youtube.com/live/rB6BBL3mi5Y?si=tt3NXod5qP1b2BmP
[youtube] rB6BBL3mi5Y: Downloading webpage
[youtube] rB6BBL3mi5Y: Downloading tv client config
[youtube] rB6BBL3mi5Y: Downloading tv player API JSON
[youtube] rB6BBL3mi5Y: Downloading ios player API JSON
ERROR: [youtube] rB6BBL3mi5Y: Join this channel to get access to members-only content like this video, and other exclusive perks.
Traceback (most recent call last):
File "/opt/homebrew/bin/yt-dlp", line 8, in
sys.exit(main())
~~~~^^
술래잡기 5시간 전 대댓글
아니면 다운로드 받은 쿠키데이타가 제 맥북 다운로드 경로에 있는데 위에서 설명해 주신대로
yt-dlp --cookies /path/to/cookies.txt 'https://www.youtube.com/live/rB6BBL3mi5Y?si=tt3NXod5qP1b2BmP'
이렇게 하고서 다운로드 받으려고 하니 에러가 나거든요.
제가 이쪽으로는 잘 몰라서요. 에고.. 죄송합니다 ㅜ
×