youtube-dl 使用记录

2019-05-03 1483点热度 1人点赞 0条评论

从他人那了解到的一个新的 youtube 下载工具,可以下载 4K 以上的网站视频内容


1、关于 youtube-dl

Github 项目地址 [ 链接 ]

youtube-dl 是一个命令行程序,适用于从 YouTube.com 等更多网站上下载视频。它需要 Python 环境,版本 2.6,2.7 或 3.2+,并且是多平台支持的。

youtube-dlc 是 社区测试合并版,因 youtube-dl 自 DCMA 事件后合并速度大幅减少而诞生 [ 链接 ]

yt-dlp 是 社区新合并版,因 youtube-dlc 维护者停止维护而诞生。 [ 链接 ]

推荐使用 yt-dlp 版本,原因是 社区活跃 可以修补大量陈旧问题


2、安装 youtube-dl

作者提供了二进制文件,所以直接可以下载并运行

sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl

然后我们可以测试 youtube-dl 是否安装成功

[[email protected] youtube-dl]# youtube-dl -v
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2019.04.30
[debug] Python version 2.7.5 (CPython) - Linux-5.0.11-1.el7.elrepo.x86_64-x86_64-with-centos-7.6.1810-Core
[debug] exe versions: none
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.

当然你也可以直接通过 Python 的 pip 来安装,这样可以指定程序执行时的 python 环境。

yum install python36 python36-pip
pip3.6 install --upgrade youtube-dl

[[email protected] youtube-dl]# youtube-dl -v
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2019.04.30
[debug] Python version 3.6.6 (CPython) - Linux-5.0.11-1.el7.elrepo.x86_64-x86_64-with-centos-7.6.1810-Core
[debug] exe versions: none
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.

如果你需要让 youtube-dl 自动合成下载好的视频,或者想得到更高品质的视频,都需要安装 ffmpeg 环境
(默认情况下,如果没有 ffmpeg 则只会下载同时有视频流和音频流的文件,存在低画质的问题)

rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
yum install ffmpeg ffmpeg-devel -y
ffmpeg -version

Windows 的 ffmpeg 可以到 Github 下载 [ 链接 ]
Static 静态编译 / Shared 动态链接 / GPL 完全开源 / LGPL 组件开源 / Vulkan 外扩展

当你安装好 ffmpeg 后,重新查看 youtube-dl 的信息

[[email protected] ~]# youtube-dl -v
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2019.04.30
[debug] Python version 3.6.6 (CPython) - Linux-5.0.11-1.el7.elrepo.x86_64-x86_64-with-centos-7.6.1810-Core
[debug] exe versions: ffmpeg 2.8.15, ffprobe 2.8.15
[debug] Proxy map: {}
Usage: youtube-dl [OPTIONS] URL [URL...]

youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.

你可以查看 youtube-dl 支持的网站列表

youtube-dl --list-extractors

3、使用 youtube-dl

通常直接使用命令后面跟随 url 地址的方式即可

youtube-dl [url]

但是你会发现,你在这个状态下下载的视频并不是最清晰的,这时候你可以通过 -F 参数或者是 --list-formats 参数查看服务端支持的所有流
(默认情况下,youtube-dl 会尝试下载最佳可用质量,即如果你想要最好的质量,你不需要传递任何特殊选项,youtube-dl 默认会为你选择一个最好的。)

[[email protected] youtube-dl]# youtube-dl -F https://www.youtube.com/watch?v=PWeH_CcTq_8
[ youtube ] PWeH_CcTq_8: Downloading webpage
[ youtube ] PWeH_CcTq_8: Downloading video info webpage
[ info ] Available formats for PWeH_CcTq_8:
format code  extension  resolution note
249          webm       audio only DASH audio   61k , opus @ 50k, 4.63MiB
250          webm       audio only DASH audio   77k , opus @ 70k, 6.13MiB
140          m4a        audio only DASH audio  128k , m4a_dash container, [email protected], 12.45MiB
251          webm       audio only DASH audio  145k , opus @160k, 12.17MiB
171          webm       audio only DASH audio  174k , [email protected], 12.76MiB
160          mp4        256x110    144p   88k , avc1.4d400b, 24fps, video only, 7.53MiB
278          webm       256x110    144p  119k , webm container, vp9, 24fps, video only, 6.98MiB
133          mp4        426x182    240p  191k , avc1.4d400d, 24fps, video only, 16.14MiB
242          webm       426x182    240p  253k , vp9, 24fps, video only, 15.22MiB
243          webm       640x274    360p  489k , vp9, 24fps, video only, 28.08MiB
134          mp4        640x274    360p  494k , avc1.4d4015, 24fps, video only, 41.07MiB
244          webm       854x366    480p  708k , vp9, 24fps, video only, 50.57MiB
135          mp4        854x366    480p  914k , avc1.4d401e, 24fps, video only, 76.10MiB
247          webm       1280x548   720p 1250k , vp9, 24fps, video only, 100.90MiB
136          mp4        1280x548   720p 1845k , avc1.4d401f, 24fps, video only, 148.01MiB
248          webm       1920x822   1080p 2466k , vp9, 24fps, video only, 178.39MiB
137          mp4        1920x822   1080p 3379k , avc1.640028, 24fps, video only, 268.37MiB
18           mp4        640x274    medium , avc1.42001E, [email protected] 96k, 66.18MiB
43           webm       640x360    medium , vp8.0, [email protected], 83.68MiB
22           mp4        1280x548   hd720 , avc1.64001F, [email protected] (best)

你可以通过手工指定 --format 的方式下载对应流,一个完整的视频一般需要 [ 视频流+视频流+音频流+音频流+字幕流+字幕流 ]
(如果中间是逗号则不合并仅分开下载)

youtube-dl -f '137+171' https://www.youtube.com/watch?v=PWeH_CcTq_8

在这里提醒一下

1、如果你没有安装 ffmpeg,则你无参数时下载的是第 22 号格式代码的文件,此文件包含了音频和视频,但并不是分辨率最大的选择。
2、如果你已经安装了 ffmpeg,则你下载的是第 137 号与第 171 号格式代码的文件,然后由 ffmpeg 合并成最终视频并自动删除合并前文件。
3、如果你没有安装 ffmpeg,并且采用手工指定的方式下载,你只会下载到两个文件,不会合并成最终文件。

一般没有参数时等同于下面这样手动指定的方式,

youtube-dl -f 'bestvideo+bestaudio' [url]

以及如果你想手工的限制下载时的最大分辨率,你可以在后面额外添加 [] 并指定信息。
(本例限制视频流最大高度不得超过 1080P,如果服务器没分视频流和音频流则下载最大高度不超过 720P 的文件)

youtube-dl -f 'bestvideo[height<=1080]+bestaudio/best[height<=720]' [url]

这里的文字参数一共有六种,分别如下

best:选择具有视频和音频的单个文件所代表的最佳质量格式。
worst:选择具有视频和音频的单个文件所代表的最差质量格式。
bestvideo:选择最佳质量的仅视频格式(例如 DASH 视频)。可能无法使用。
worstvideo:选择质量最差的纯视频格式。可能无法使用。
bestaudio:选择质量最佳的音频格式。可能无法使用。
worstaudio:选择质量最差的音频格式。可能无法使用。

如果希望合成为 MP4 文件,因为 Ubuntu 的 ffmpeg 无法将 webm 音频 直接与 mp4 合并,所以需要使用 m4a 音频格式
关于格式,webm 和 mp4 都作为容器,实际视频编码为 vp8 或者 avc1

youtube-dl -f 'bestvideo+(bestaudio[ext=m4a]/bestaudio)' --merge-output-format mp4 [url]

如果你希望指定文件名,可以使用 --output 指定

youtube-dl --output [url]

如果你希望下载视频封面和视频简介,会在同级文件夹下创建两个新文件储存信息

youtube-dl --write-thumbnail --write-description

如果你的下载客户端在国内,你可能需要手动指定代理,通常有两种方式指定

youtube-dl --http-proxy HOST:PORT [url]
youtube-dl --socks-proxy HOST:PORT [url]

如果你下载的网站需要登陆才可以访问的资源,你可以添加账号密码参数
也可以通过创建 .netrc 文件来储存账号密码(不推荐)参见 [ 链接 ]

youtube-dl -u "yourname" -p "yourpass"  [url]

4、使用 youtube-dl 获取字幕

查看视频的字幕类型清单

youtubd-dl --list-subs [url]

下载视频并额外下载英文的 vtt 格式的字幕文件

youtubd-dl --write-sub --sub-lang en [url]

下载视频并额外下载中文的 vtt 格式的字幕文件,并直接合并到视频文件中(需要 ffmpeg 支持)

youtubd-dl --write-sub --sub-lang zh --embed-sub [url]

不下载视频,只下载英文的 vtt 格式的字幕文件

youtube-dl --write-sub --skip-download [url]

下载视频并额外下载所有语言的 vtt 格式的字幕文件

youtube-dl --write-sub --all-subs [url]

如果你想将 VTT 字幕转换为 SRT 纯文字字幕,你可以设置字幕保存的格式

youtube-dl --write-sub --sub-format "ass/srt/best" --convert-subs "srt"' [url]

又或者想下载流媒体,但是 m3u8 格式需要合并

ffmpeg -i [url] -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4

又或者需要对视频进行转码(CRF 越大文件越小)

ffmpeg -i [file] -c:v libx264 -crf 16 -c:a copy output.mp4

5、使用 Cookie 解开订阅限制

有一些视频存在版权或订阅限制,又或者网站通过 Cookie 追踪用户并限制访问方式

此时我们需要添加 Cookie 信息,并在下载时指定 Cookie 信息。

注意本方式提取 Cookie 的浏览器不可注销用户(限定登陆状态)

Chrome 打开目标网站,访问页面后,按 F12 启用开发者工具 DevTools,选择 网络,按 F5 刷新网页,找到等同于地址栏请求 URL 的第一个报文 类型 document 状态 200 后,点击标头,在请求标头内容中提取 cookie: ABC******DEF 相关字符串。

提取到该字符串后,我们可以在命令中直接增加该字段,此时将携带身份访问目标服务器。

youtube-dl --add-header "Cookie: ABC******DEF" [url]

或者我们可以保存为一个文件,并通过读取该文件的方式长期使用。

youtube-dl --add-header "Cookie: $(cat youtube-header.txt)" [url]

[email protected]:~#cat youtube-header.txt
PREF=tz=Asia.Shanghai;__Secure-3PAPISID=QWERTYUIOP

如果认为该方式提取的 Cookie 信息实在过多,而且使用的时候可能会有其他的麻烦(比如地域管控)

我们可以通过指定 Netscape 格式的 Cookie 进行挂载

youtube-dl --cookies cookies.txt [url]

所以我们需要提取我们用得到的 Cookie 来使用,此时我们需要 了解 Netscape Cookie 格式
注意 Netscape 文件首行必须存在标识 # Netscape HTTP Cookie Fileile 同时使用 Tab 做分隔符(不能用空格

# Netscape HTTP Cookie Fileile
# Useage Example 
#   1) wget -x --load-cookies cookies.txt [url]
#   2) curl --cookie cookies.txt [url]
#   3) aria2c --load-cookies cookies.txt [url]
#   4) youtube-dl --cookies cookies.txt [url]
# ------------
# Domain        HTTP      Path    Secure  Timestamp   Name                Value
.youtube.com    TRUE      /       TRUE    0           PREF                tz=Asia.Shanghai
.youtube.com    TRUE      /       TRUE    0           __Secure-3PAPISID   QWERTYUIOP

本格式为通用 Cookie 储存格式,对应浏览器 F12 中的 储存 Cookie 部分

懒人 Chrome 的 Cookie 脚本 [ 链接 ] (不建议)

我们可以直接使用 js 脚本读取浏览器中的 cookie 并保存到本地(小心泄露)

(function() {
  let S = '# Netscape HTTP Cookie File\n';
  for (raw_cookie of document.cookie.split(';')) {
    let cookie = raw_cookie.trim();
    let separator = cookie.indexOf('=');
    let name = cookie.substring(0, separator);
    let value = cookie.substring(separator + 1);

    let domain = window.location.hostname;
    // hopefully this will convert domains like `www.test.com` and `test.com` into `.test.com`
    domain = domain.replace('www.', '.');
    if (domain[0] !== '.') {
        domain = '.' + domain;
    }

    // netscape cookie file format:
    // # domain  HTTP PATH SECURE timestamp name  value
    // .test.com TRUE /    FALSE  123456789 token 1234abcdef
    S += `${domain}\tTRUE\t/\tTRUE\t0\t${name}\t${value}\n`
  }

  console.log(S)
})();

注意 Cookie 含有一个选项为 HTTPOnly,该选项启用时会限制非 http 请求读取该 cookie(如 JS 脚本 读 Cookie)
所以如果通过浏览器,我们可以看到更多的 http only 启用的 Cookie 但无法被脚本读取。

注意 Cookie 含有一个选项为 Secure,该选项启用时会限制非 安全/加密 请求读取该 cookie(如 http 读 Cookie)

还可以使用命令读取浏览器所有 Cookie(完全模拟用户)

yt-dlp --cookies youtube-cookie.txt --cookies-from-browser chrome

但因为所有 Cookie 都会被导出,极高风险,慎重考虑


6、使用 yt-dlp 支持更多选项

6.1、youtube-dl 与 yt-dlp 的显著区别

社区版和官方版本还是有很多区别的。

youtube-dl 采用 best 而非 (bestvideo+bestaudio)/best
yt-dlp 采用 (bestvideo*+bestaudio)/best(如果最高分辨率的文件同时含有音频,则直接使用该文件)

youtube-dl 允许 多视频或多音频 的合并
yt-dlp 禁止 多视频或多音频 的合并,需要手动开启以支持多轨合并

youtube-dl 不支持 喜好 --format-sort 参数
yt-dlp 支持 喜好 --format-sort 参数以调节匹配优先级

youtube-dl 默认输出模板 %(title)s-[%(id)s].%(ext)s
yt-dlp 默认输出模板 含空格 为 %(title)s [%(id)s].%(ext)s

当需要展示视频所支持的格式时,两者也有不同。(best 标记变成 ~ 符号放在 文件大小 前面)

[email protected]:~# yt-dlp -F https://www.youtube.com/watch?v=PWeH_CcTq_8
PWeH_CcTq_8: Downloading webpage
PWeH_CcTq_8: Downloading android player API JSON
Available formats for PWeH_CcTq_8: ID EXT RESOLUTION FPS │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ASR MORE INFO ───────────────────────────────────────────────────────────────── sb2 mhtml 48x27 │ mhtml │ images storyboard sb1 mhtml 105x45 │ mhtml │ images storyboard sb0 mhtml 210x90 │ mhtml │ images storyboard 139 m4a │ 4.78MiB 48k https │ audio only mp4a.40.5 48k 22050Hz low, m4a_dash 249 webm │ 4.63MiB 47k https │ audio only opus 47k 48000Hz low, webm_dash 250 webm │ 6.13MiB 62k https │ audio only opus 62k 48000Hz low, webm_dash 140 m4a │ 12.69MiB 129k https │ audio only mp4a.40.2 129k 44100Hz medium, m4a_dash 251 webm │ 12.17MiB 124k https │ audio only opus 124k 48000Hz medium, webm_dash 394 mp4 256x110 24 │ 5.22MiB 53k https │ av01.0.00M.08 53k video only 144p, mp4_dash 160 mp4 256x110 24 │ 9.07MiB 92k https │ avc1.4d400b 92k video only 144p, mp4_dash 278 webm 256x110 24 │ 6.98MiB 71k https │ vp9 71k video only 144p, webm_dash 17 3gp 176x144 12 │ 7.65MiB 78k https │ mp4v.20.3 78k mp4a.40.2 0k 22050Hz 144p 395 mp4 426x182 24 │ 10.95MiB 111k https │ av01.0.00M.08 111k video only 240p, mp4_dash 133 mp4 426x182 24 │ 22.78MiB 232k https │ avc1.4d400d 232k video only 240p, mp4_dash 242 webm 426x182 24 │ 15.22MiB 155k https │ vp9 155k video only 240p, webm_dash 396 mp4 640x274 24 │ 23.21MiB 236k https │ av01.0.01M.08 236k video only 360p, mp4_dash 134 mp4 640x274 24 │ 43.24MiB 441k https │ avc1.4d4015 441k video only 360p, mp4_dash 18 mp4 640x274 24 │ 66.18MiB 675k https │ avc1.42001E 675k mp4a.40.2 0k 44100Hz 360p 243 webm 640x274 24 │ 28.08MiB 286k https │ vp9 286k video only 360p, webm_dash 397 mp4 854x366 24 │ 41.70MiB 425k https │ av01.0.04M.08 425k video only 480p, mp4_dash 135 mp4 854x366 24 │ 62.26MiB 635k https │ avc1.4d401e 635k video only 480p, mp4_dash 244 webm 854x366 24 │ 50.57MiB 516k https │ vp9 516k video only 480p, webm_dash 398 mp4 1280x548 24 │ 84.04MiB 857k https │ av01.0.05M.08 857k video only 720p, mp4_dash 136 mp4 1280x548 24 │ 98.44MiB 1004k https │ avc1.4d401f 1004k video only 720p, mp4_dash 22 mp4 1280x548 24 │ ~113.75MiB 1133k https │ avc1.64001F 1133k mp4a.40.2 0k 44100Hz 720p 247 webm 1280x548 24 │ 100.90MiB 1029k https │ vp9 1029k video only 720p, webm_dash 399 mp4 1920x822 24 │ 147.40MiB 1504k https │ av01.0.08M.08 1504k video only 1080p, mp4_dash 137 mp4 1920x822 24 │ 296.28MiB 3023k https │ avc1.640028 3023k video only 1080p, mp4_dash 248 webm 1920x822 24 │ 178.39MiB 1820k https │ vp9 1820k video only 1080p, webm_dash

个人常用的文件下载及字幕联合处理方式(1080P MP4 内嵌 SRT 字幕 / 4K WEBM 外挂 VTT 字幕)

yt-dlp --merge-output-format mp4 --format-sort "res:1080,vcodec:av1" --format '(bestvideo*+bestaudio)/best' --write-thumbnail --write-description --write-subs --sub-langs "zh-CN,zh-TW,en,ja" --sub-format "ass/srt/vtt/best" --convert-subs "srt" --embed-sub [url]
yt-dlp --merge-output-format webm --format-sort "res:2160,vcodec:av1" --format '(bestvideo*+bestaudio)/best' --write-thumbnail --write-description --write-subs --sub-langs "zh-CN,zh-TW,en,ja" --sub-format "ass/srt/vtt/best" [url]

6.2、多线程下载

或许我们可能需要多线程下载,但通常受限于网速,单线程已经拉满了。

默认的线程数是 1 ,未开启多线程下载同时也是减少 被降速 的可能性

yt-dlp --concurrent-fragments 8 [url]

同时额外增加一个选项为 失败后重试下载,默认重试次数 10

yt-dlp --retries 10 [url]

6.3、低速重新下载

在批量下载视频时经常会遇到一个情况:速度本来 10MB/s 回头一看 10KB/s

这是因为 CDN 或 站点策略 限制了用户反复爬取,而网页的解决方式是 刷新页面

对于 yt-dlp 而言,社区增加了一个解决方案,使用一个参数作为最低速度限制,低于则重新下载 [ 链接 ]

yt-dlp --throttled-rate 100K [url]

6.4、优先级排序方式

ytdlp 支持 --format-sort 管理优先级顺序,也可以通过 --format 参数使用用户指定参数

两者参数优先级不同,--format 的优先级高于 --format-sort 的优先级

yt-dlp --format 'bestvideo[vcodec^=avc1]+bestaudio' --format-sort "vcodec:av01"

此时虽然优先级排序会将 av01 类型作为优先选择项,但因为 --format 指定了 vcodec^=avc1 而将 下载选择 限定在 avc1 格式

更多优先级顺序可以参考 [ 链接 ]


6.5、限定访问所使用的 IP 协议

IPV6 是很优秀,但经常能遇到 IPV6 无法打开或下载的情况。

yt-dlp --force-ipv4 [url]

7、相关链接

youtube-dl 使用小记 [ 链接 ]

更好理解 youtube-dl 该如何使用 [ 链接 ]

StarryVoid

Have a good time