0%

用 Homebrew 安裝 youtube-dl 下載 YouTube 影片

Youtube-dl 这套强大的网络影片下载器,目前很多朋友可能会使用一些线上下载YouTube的网站,除了网页上满满的广告之外,还可能会常常遇到画质、音质不佳、下载速度慢,或是根本无法正常下载,毕竟 YouTube 也是随时在改版,虽然 Google 对于下载 YouTube 这件事算睁一只眼闭一只眼,但时不时还是会顺手防堵下载的漏洞。
而 youtube-dl 则是在 GitHub 上公开的开源软体,且他更新的频率相当惊人,几乎每隔几天就会更新,而更新内容大多都是针对各个影音网站的下载支持或功能修正。虽然 youtube-dl 没有 GUI,而是通过终端命令行操作,但非常轻量,且效率极佳。

安装 youtube-dl

请先安装 Homebrew,若你已经装好 Homebrew,则可以透过指令来安装 youtube-dl,打开终端并输入:

1
brew install youtube-dl

安装 ffmpeg

我们下载 YouTube 影片时可能会用到转档、嵌入字幕等功能,这些功能必须安装 ffmpeg 来达成。

1
brew install ffmpeg

运行

如上面所说,youtube-dl 没有GUI,而是通过终端操作,因此在应用程序里是找不到它的,必须使用终端来操作。

下载影片

在 macOS 中,终端预设目录是下载文件夹,但我们一般下载影片通常不会存在预设目录里,因此我们可以先指定下载目录。

选择好下载目录后,在终端输入 youtube-dl,后跟 YouTube 影片网址即可下载,以下载 YouTube 影片 第五季 | 預告 Trailer【畫江湖之不良人 第5季 The Degenerate-Drawing Jianghu S5】 为例:

1
2
3
4
5
[liudongkai@MBPR DIR]$ youtube-dl 'https://www.youtube.com/watch?v=aaIUjeg9MpY'

[youtube] aaIUjeg9MpY: Downloading webpage
[download] Destination: 第五季 _ 預告 Trailer【畫江湖之不良人 第5季 The Degenerate-Drawing Jianghu S5】-aaIUjeg9MpY.mp4
[download] 3.9% of 5.54MiB at 64.92KiB/s ETA 01:23

按下回车之后 youtube-dl 便开始下载,在没有设定任何下载选项的状况下,可以看到这支影片以预设的 WebM 格式下载到下载项目资料夹中。在 YouTube 下载影片,来源的影片文件可能是各种格式、分段或是影音分开,这时通常都是靠 ffmpeg 将其转换为单一的影片文件。

影片转档

刚刚下载的影片是 WebM 格式储存(有时可能是 mov 或 mkv 等等)不过其实 WebM 通常用于网页播放,我们一般在电脑、手机播放或剪辑,其实还是以 mp4 最通用。因此,我们可以在 youtube-dl 下载影片时,在指令后方加入 -f mp4 即可指定下载成 mp4 文件格式:

1
youtube-dl 'https://www.youtube.com/watch?v=aaIUjeg9MpY' -f mp4

所以 -f 后面的文件格式也可以换成 3gp、aac、flv、m4a、mp3、mp4、ogg、wav、webm 等等。

下载完成的文件,以 YouTube 来说,下载的文件名称就是 影片名称-影片网址的编号.文件格式,如上文案例文件名为:第五季 _ 預告 Trailer【畫江湖之不良人 第5季 The Degenerate-Drawing Jianghu S5】-aaIUjeg9MpY.mp4

指定最高质量下载

YouTube 通常会提供不同分辨率、不同码率的影片文件,我们可以通过指定编码序号进行下载。首先使用 -F 参数查看相关编码序号与质量(注意F为大写)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[liudongkai@MBPR DIR]$ youtube-dl -F 'https://www.youtube.com/watch?v=aaIUjeg9MpY' 
[youtube] aaIUjeg9MpY: Downloading webpage
[info] Available formats for aaIUjeg9MpY:
format code extension resolution note
249 webm audio only tiny 44k , webm_dash container, opus @ 44k (48000Hz), 342.00KiB
250 webm audio only tiny 58k , webm_dash container, opus @ 58k (48000Hz), 450.04KiB
251 webm audio only tiny 117k , webm_dash container, opus @117k (48000Hz), 894.48KiB
140 m4a audio only tiny 129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 990.85KiB
160 mp4 256x106 144p 47k , mp4_dash container, avc1.4d400b@ 47k, 25fps, video only, 362.21KiB
394 mp4 256x106 144p 48k , mp4_dash container, av01.0.00M.08@ 48k, 25fps, video only, 372.20KiB
278 webm 256x106 144p 55k , webm_dash container, vp9@ 55k, 25fps, video only, 427.04KiB
395 mp4 426x178 240p 86k , mp4_dash container, av01.0.00M.08@ 86k, 25fps, video only, 658.65KiB
133 mp4 426x178 240p 100k , mp4_dash container, avc1.4d400d@ 100k, 25fps, video only, 766.11KiB
242 webm 426x178 240p 103k , webm_dash container, vp9@ 103k, 25fps, video only, 792.85KiB
396 mp4 640x266 360p 165k , mp4_dash container, av01.0.01M.08@ 165k, 25fps, video only, 1.24MiB
134 mp4 640x266 360p 198k , mp4_dash container, avc1.4d4015@ 198k, 25fps, video only, 1.48MiB
243 webm 640x266 360p 216k , webm_dash container, vp9@ 216k, 25fps, video only, 1.62MiB
397 mp4 854x356 480p 298k , mp4_dash container, av01.0.04M.08@ 298k, 25fps, video only, 2.23MiB
135 mp4 854x356 480p 356k , mp4_dash container, avc1.4d401e@ 356k, 25fps, video only, 2.66MiB
244 webm 854x356 480p 382k , webm_dash container, vp9@ 382k, 25fps, video only, 2.85MiB
398 mp4 1280x532 720p 562k , mp4_dash container, av01.0.05M.08@ 562k, 25fps, video only, 4.20MiB
136 mp4 1280x532 720p 613k , mp4_dash container, avc1.4d401f@ 613k, 25fps, video only, 4.57MiB
247 webm 1280x532 720p 710k , webm_dash container, vp9@ 710k, 25fps, video only, 5.30MiB
399 mp4 1920x798 1080p 983k , mp4_dash container, av01.0.08M.08@ 983k, 25fps, video only, 7.34MiB
248 webm 1920x798 1080p 1246k , webm_dash container, vp9@1246k, 25fps, video only, 9.30MiB
137 mp4 1920x798 1080p 1540k , mp4_dash container, avc1.640028@1540k, 25fps, video only, 11.50MiB
400 mp4 2048x852 1080p 2075k , mp4_dash container, av01.0.08M.08@2075k, 25fps, video only, 15.49MiB
271 webm 2048x852 1080p 2298k , webm_dash container, vp9@2298k, 25fps, video only, 17.15MiB
18 mp4 640x266 360p 487k , avc1.42001E, 25fps, mp4a.40.2 (44100Hz), 3.64MiB
22 mp4 1280x532 720p 742k , avc1.64001F, 25fps, mp4a.40.2 (44100Hz) (best)

查看输出列表,找到画质音质最好的序号,案例中1920x798分辨率下视频最好的是271,音频最好的是140,得到这两个序号后,可以通过 youtube-dl -f 视频序号+音频序号 进行合并下载,这样下载后,视频和音频会自动合并。

1
2
3
4
5
6
[liudongkai@MBPR DIR]$ youtube-dl -f 271+140 'https://www.youtube.com/watch?v=aaIUjeg9MpY'
[youtube] aaIUjeg9MpY: Downloading webpage
WARNING: You have requested multiple formats but ffmpeg or avconv are not installed. The formats won't be merged.
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
[download] Destination: 第五季 _ 預告 Trailer【畫江湖之不良人 第5季 The Degenerate-Drawing Jianghu S5】-aaIUjeg9MpY.f271.webm
[download] 5.8% of 17.15MiB at 942.21KiB/s ETA 00:17

注意:-f 后跟的两个序号需要必须先视频后音频

嵌入字幕

有时 YouTube 影片会有不同语言的 CC 字幕可选择,我们可以透过 youtube-dl 将字幕嵌入到影片中。

首先我们先列出可以下载的字幕,以上文案例为例,在 youtube-dl 下载指令后方加入 –list-subs

1
youtube-dl 'https://www.youtube.com/watch?v=aaIUjeg9MpY' --list-subs

youtube-dl 分析 YouTube 网页后,在最下方 Available subtitles 列出可用的字幕包含:

  • zh-CN
  • en
  • zh
  • zh-TW

也就是简体中文、英文、中文、中文(台湾)这几种选择。

有关嵌入字幕的 youtube-dl 指令:

1
2
3
4
--write-sub #下载字幕
--embed-sub #嵌入字幕
—-sub-lang zh-CN #指定语言(以简体中文为例)
--all-subs #下载所有字幕(如果要将所有可用的字幕嵌入)

因此如果我们要下载嵌入简体中文字幕的 mp4 影片,指令为:

1
youtube-dl 'https://www.youtube.com/watch?v=aaIUjeg9MpY' --write-sub --embed-sub --sub-lang zh-CN -f mp4

支援嵌入字幕的影片格式包含:mp4、mkv 以及 webm;与格式工厂、HandBreak 那种将字幕直接写入在影片画面上的方式不同,使用 youtube-dl 嵌入的字幕是可以选择开启或关闭,以及选择不同语言的。此外,语系的代号大小写有别,必须一模一样,例如简体中文 zh-CN 的 CN 一定要是大写,非常重要!

下载完成后,以 QuickTime Player 打开,可以看到出现中文字幕的选项;若是以其他播放软体如 INNA 开启,也是可以选择字幕的,不过每个软件显示情况可能有所不同。

高级应用

指定格式以最优质量下载视频

1
2
3
4
5
6
# 指定视频为mp4格式、音频为m4a格式以最优质量下载youtube视频,其它网站暂未测试,官方说Windows下换单引号为双引号
youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' 'https://www.youtube.com/watch?v=aaIUjeg9MpY'

# 或者直接使用默认设置,一般会下载两个webm文件,分别为视频和音频,
# 再自动合并成附带音轨的webm格式视频,测试发现也是最高分辨率,有4K就下4K版本
youtube-dl 'https://www.youtube.com/watch?v=aaIUjeg9MpY'

以最优质量下载音频

1
2
3
4
5
6
7
8
# 默认下载音频为opus格式
youtube-dl -x 'https://www.youtube.com/watch?v=aaIUjeg9MpY'

# 下载mp3格式的音频
youtube-dl -x --audio-format mp3 'https://www.youtube.com/watch?v=aaIUjeg9MpY'

# 最优质量下载音频
youtube-dl -f bestaudio --extract-audio --audio-format mp3 --audio-quality 0 'https://www.youtube.com/watch?v=aaIUjeg9MpY'

下载播放列表中的视频

1
2
3
4
5
6
7
8
# 使用默认,与下载单个视频格式一样
youtbue-dl 'https://www.youtube.com/watch?v=rbxjUvJjFhU&list=PLTQ0CcMHNrjudMnoc2wCxWk0el8AIhWhd'

# 可以使用选项--playlist-start, --playlist-end或者指定某个视频 --playlist-items
# --playlist-items 可设置多个值.如:"--playlist-items 1,2,5 下载1、2、5项

# 下载列表第二个及以后的所有视频
youtube-dl --playstart-start 2 'https://www.youtube.com/watch?v=rbxjUvJjFhU&list=PLTQ0CcMHNrjudMnoc2wCxWk0el8AIhWhd'

限定分辨率下载播放列表中的视频

1
2
# 以最高480P下载列表第3个及以后的所有视频
youtube-dl --playlist-start 3 -f 'bestvideo[height<=480]+bestaudio/best[height<=480]' 'https://www.youtube.com/watch?v=rbxjUvJjFhU&list=PLTQ0CcMHNrjudMnoc2wCxWk0el8AIhWhd'

下载播放列表中视频的音轨

1
2
3
4
# 使用--playlist-start、--playlist-end、--playlist-items来限定

# 最优质量下载播放列表中3-6这四个视频的音频文件,并转换成mp3格式
youtube-dl -f bestaudio --extract-audio --audio-format mp3 --audio-quality 0 --playlist-start 3 --playlist-end 6 'https://www.youtube.com/watch?v=rbxjUvJjFhU&list=PLTQ0CcMHNrjudMnoc2wCxWk0el8AIhWhd'

调用aria2加速下载

​解决使用youtube-dl默认下载时常常断开连接的问题。

1
youtube-dl --external-downloader aria2c --external-downloader-args "-x 16 -k 1M" 'https://www.youtube.com/watch?v=aaIUjeg9MpY'

参数说明:

1
2
3
4
--external-downloader aria2c # 调用外部下载工具
--external-downloader-args # 外部下载工具指定参数
-x 16 # 启用aria2 16个线程,最多就支持16线程
-K 1M # 指定块的大小

参考: