基本下载
完全不加任何选项时,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
文件名与文件夹
输出模板同时控制这两者。斜杠会创建目录,所以一个模板就能安排整个归档的结构。
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 会拒绝,而且它拒绝得有道理。