跳到正文
yt-dlp

yt-dlp 速查表

值得记住的 yt-dlp 命令:选画质、提取 MP3、播放列表、字幕、cookies,以及真正会遇到的报错怎么解决。

本手册针对 yt-dlp 2026.07.21 编写。不同版本之间会新增和改名选项,请用 yt-dlp --version 确认你的版本。

基本下载

完全不加任何选项时,yt-dlp 会挑出它能合并的最佳组合,并用标题给文件命名。出乎意料地经常,这就是正确的命令。

yt-dlp URL

在下载大文件之前,先看看实际提供了哪些格式是值得的。这条命令会打印格式表,然后什么都不下载就退出。

yt-dlp -F URL

表格最左边一列是格式 id,之后你可以直接指定它。两个 id 用 + 连起来,意思是「两个都下载并合并」。

yt-dlp -f 137+140 URL

画质与格式选择

写死的格式 id 会在网站改动编码梯度的那一刻失效。选择器表达式才是耐用的写法:说出你要的属性,让 yt-dlp 自己去找最匹配的。

yt-dlp -f "bv*[height<=1080]+ba/b[height<=1080]" URL

这样读它:高度不超过 1080 的最佳视频流加上最佳音频;如果这一对不存在,就取高度不超过 1080 的最佳单一文件。斜杠后面的这个退路,正是让命令在只提供渐进式流的网站上不至于失败的关键。

合并两条流时,yt-dlp 必须选一个容器。MP4 到处都能播;MKV 什么都能装,一旦牵涉到字幕和章节,这一点就要紧了。

yt-dlp -f "bv*+ba" --merge-output-format mp4 URL

如果你想表达偏好而不是硬性上限,就用排序而不是过滤。这样会优先 1080p 和 MP4,但两者都没有时仍然会下载点什么。

yt-dlp -S "res:1080,ext:mp4" URL

音频与 MP3

提取音频需要 ffmpeg——在全新安装的环境里,下面这条命令失败的最常见原因就是它。

yt-dlp -x --audio-format mp3 URL

加上封面图和标签只多两个 flag,却能让结果在音乐库里真正可用,而不是变成一堆没有名字的文件。

yt-dlp -x --audio-format mp3 --audio-quality 0 --embed-thumbnail --embed-metadata URL

--audio-quality 0 指的是可变比特率的最佳档位,不是「零质量」。如果你需要固定比特率,就明确写出来:--audio-quality 320K

当源已经是 AAC 或 Opus 时,转成 MP3 会重新编码,白白损失质量。保留原格式既更快也更好。

yt-dlp -x --audio-format best URL

字幕

内嵌字幕会跟着文件一起走;单独的 .srt 文件更方便编辑,也更方便交给别的工具处理。

yt-dlp --embed-subs --sub-langs en URL
yt-dlp --write-subs --sub-langs en,vi --convert-subs srt URL

机器生成的字幕是另一个开关。不加它的话,一个没有人工字幕的视频什么都不会产出,而且不会报错。

yt-dlp --write-auto-subs --sub-langs en --convert-subs srt --skip-download URL

播放列表与频道

一个 YouTube 网址常常同时属于一个视频和一个播放列表,yt-dlp 只能猜你指的是哪个。明确说出来。

yt-dlp --no-playlist URL
yt-dlp --yes-playlist URL

对任何长任务来说,归档文件比这里其他任何选项都重要:它记录了已经下载过什么,于是重跑时会从停下的地方接着走,而不是从头开始。

yt-dlp --yes-playlist -i \
  --download-archive archive.txt \
  -o "%(playlist_index)02d - %(title)s.%(ext)s" \
  URL

配合 -i,一个地区受限或已删除的视频就不会再中断其余两百个。若只想取其中一段而不是全部,-I 接受区间和列表:-I 1:10-I "1,3,7-10"

片段、章节与赞助段落

你可以只下载视频的一部分而不是整个。开头的星号表示这是时间戳而不是章节名,引号是必须的——裸的 * 会被 bash 拿去匹配你的文件名。

yt-dlp --download-sections "*00:01:30-00:03:00" URL

SponsorBlock 使用社区提交的标记,可以把片段整段剪掉,也可以把它们保留为章节,由你自己跳过。

yt-dlp --sponsorblock-remove default URL
yt-dlp --sponsorblock-mark all --embed-chapters URL

登录、Cookie 与机器人验证

私密内容、年龄受限内容和会员专属内容都需要你的会话。直接从浏览器读取是最不容易出错的路径。

yt-dlp --cookies-from-browser chrome URL
yt-dlp --cookies-from-browser "firefox:Profile 1" URL

先把浏览器关掉:Chrome 和 Edge 在运行时会锁住 cookie 数据库,而随之出现的错误信息并不会告诉你这一点。

当一个网站开始返回 403,或者要求你确认自己不是机器人时,把请求伪装得像真实浏览器通常就能通过。

yt-dlp --impersonate chrome URL

文件名与文件夹

输出模板同时控制这两者。斜杠会创建目录,所以一个模板就能安排整个归档的结构。

yt-dlp -o "%(uploader)s/%(upload_date>%Y-%m-%d)s - %(title)s.%(ext)s" URL

标题里常常有某些文件系统不接受的字符。--restrict-filenames 会把一切降到纯 ASCII,对任何要在机器之间搬动的东西来说都是值得的。

在 Windows 的 .bat 文件里,每个 % 都必须写两遍——%%(title)s——否则批处理解释器会在 yt-dlp 看到之前把模板吃掉。你下载 .bat 时,生成器已经替你处理好了。

你真的会遇到的错误

ffmpeg not found

凡是合并、转换、嵌入或剪切的操作,都需要 PATH 里有 ffmpeg。装好它,然后用 ffmpeg -version 确认。

Sign in to confirm you are not a bot

先试 --impersonate chrome,再试 --cookies-from-browser。两个都不行就更新 yt-dlp——这一项验证变动特别频繁,修复通常几天之内就会随新版本发布。

Unable to extract player response

几乎总是 yt-dlp 版本太旧。在动别的之前先更新它:yt-dlp -U,如果你是用包管理器装的就用包管理器。

Requested format is not available

你的选择器没有匹配到任何东西。运行 -F 看看有哪些格式,并且宁可用排序(-S)也不要用硬性过滤,这样永远留有退路。

HTTP Error 403

那个网址是为另一个会话或另一个地区签发的。用新的 cookie 重跑一遍,加上 --impersonate chrome,或者试试 --geo-bypass

让 yt-dlp 保持最新

被报告的问题里,靠更新解决的比靠任何 flag 解决的都多。如果你装的是独立可执行文件:

yt-dlp -U

如果是通过包管理器装的,就用同样的方式更新——-U 会拒绝,而且它拒绝得有道理。

常见问题

"Sign in to confirm you are not a bot" 怎么解决?
先试 --impersonate chrome,再试 --cookies-from-browser chrome 用你的登录会话。都不行就更新 yt-dlp —— 这个验证经常变,修复通常几天内就会发布。
"Unable to extract player response" 是什么意思?
网站改了什么,而你的 yt-dlp 早于对应的修复。先更新,再考虑改别的;这个报错几乎从来不是靠某个 flag 解决的。
它提示 ffmpeg not found。
合并、转换、内嵌和裁剪都需要 PATH 里有 ffmpeg。装好后用 ffmpeg -version 确认。
yt-dlp 该多久更新一次?
任何东西开始失效时就更新,此外每隔几周更新一次。网站一直在变,而大多数损坏都会在项目那边很快修好。
yt-dlp 和 youtube-dl 有什么区别?
yt-dlp 是仍在维护的分支,extractor 和功能都多得多 —— SponsorBlock、下载片段、浏览器伪装、并发 fragment。它保留了 youtube-dl 的选项名,所以大多数简单命令两边都能用。