youtube-dl 使用记录

2019-05-03 2432点热度 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
[ youtube] PWeH_CcTq_8: Downloading webpage
[ youtube] PWeH_CcTq_8: Downloading android player API JSON
[ info] 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