yt-dlp:用于下载视频的现代 youtube-dl 分支
2020年10月23日,美国唱片业协会(RIAA)向GitHub提交了针对youtube-dl项目的DMCA版权移除请求。三天后,即10月26日,一个新的代码库悄然出现在github.com/yt-dlp/yt-dlp。到11月16日GitHub恢复原项目并设立100万美元开发者保护基金时,这个新分支已经开始吸纳youtube-dl的贡献者。
该分支现在是主分支。截至 2026 年 5 月,yt-dlp 在 PyPI 上的月下载量超过 1200 万次。其 GitHub 代码库拥有 160,766 个 star。该项目大约每两周发布一个新版本。撰写本文时,最新版本号为 `2026.03.17`。它通过其提取器插件系统支持超过 1800 个视频和音频网站。接下来,我们将详细介绍 yt-dlp 的功能和使用方法,以及它在 2026 年的法律地位,并解释为什么一个原本运行良好的安装会在 2025 年中期突然停止工作。
yt-dlp 的来源:源自 youtube-dl 的分支链
这里追溯其发展脉络至关重要,因为它解释了行为上的差异。yt-dlp 能在 YouTube 宕机后数小时内修复问题;而 youtube-dl 则可能需要数周时间。这三个项目都属于同一发展脉络,每一步的推进都源于对前一步的不满。
youtube-dl 是最初的版本。Ricardo García 于 2006 年 8 月编写了它,后来 Philipp Hagemeister 带领一个精干的团队在 `ytdl-org/youtube-dl` 下继续开发。到 2020 年,它已成为事实上的归档工具,但提交的 pull request 堆积如山,YouTube 的修复程序也经常延迟发布。
正是这个空白催生了 youtube-dlc,其中的“c”代表“社区”。`blackjack4494` 于 2020 年 fork 了该代码库,合并队列在几天内就被清空。同年晚些时候,该 fork 版本本身也变得半死不活——维护者之一的脆弱性不容忽视。
yt-dlp是 youtube-dlc 的一个分支。该项目于 2020 年 10 月 26 日创建,当时距离美国唱片业协会 (RIAA) 下架上游 youtube-dl 仅三天。yt-dlp 是一个命令行工具,允许用户从支持的网站下载视频和音频。“p”代表早期的一位主要维护者(`pukkandan`)。该项目目前由一个多维护者组织管理,成员包括 `coletdjnz`、`dirkf`、`Grub4K`、`bashonly` 和 `seproDev`。到 2021 年 1 月,yt-dlp 已经吸收了 youtube-dlc 的所有贡献者,成为 youtube-dl 的主要分支。其重点在于上游尚未合并的功能和改进。
一些项目层面的事实值得一提。yt-dlp 使用日历版本控制,因此像 `2026.03.17` 这样的标签实际上就是发布日期。它的许可证是 The Unlicense,这是一种明确的公共领域贡献许可证,即使是大多数自由开源软件项目也不使用。该代码库有 13,348 个 fork 和 2,507 个未解决的问题。Ubuntu 22.04 将 youtube-dl 替换为 yt-dlp 作为其默认视频下载器,Debian 随后也用 bookworm 取代了 youtube-dl。`supportedsites.md` 中的支持站点列表目前列出了超过 1,500 个已命名的条目;代码库本身包含近 1,800 个支持延迟加载的提取器模块。Arch、Fedora、NixOS、Homebrew、Chocolatey、Scoop 和 Winget 都对其进行了打包。每年 20 到 30 个版本的发布频率使得各个发行版没有放弃更新速度较慢的上游版本。

美国唱片业协会 (RIAA) 2020 年的下架行动如何使 yt-dlp 的消亡成为必然
美国唱片业协会 (RIAA) 于 2020 年 10 月 23 日根据《美国法典》第 17 篇第 1201 条(反规避条款)提交了《数字千年版权法案》(DMCA) 通知。RIAA 认为 youtube-dl 绕过了 YouTube 的“滚动密码”签名机制,而 RIAA 将此机制视为保护用户访问受版权保护作品的技术措施。GitHub 最初遵照 RIAA 的要求,删除了该代码库及其 17 个分支。
接下来发生的事情堪称典型的斯特赖桑效应。开发者们以越来越有创意的方式重新发布了源代码,包括一张用像素颜色编码整个代码库的推特图片。2020年11月16日,电子前沿基金会(EFF)致函GitHub,其技术论证很简单:任何符合标准的浏览器都能运行的签名,并不属于《通用数据保护条例》(§ 1201)中“有效控制访问的技术措施”。youtube-dl使用了该签名,并没有破坏它。
GitHub 当天就恢复了该代码库。它还承诺设立 100 万美元的开发者保护基金,并保证今后对每一个因违反 § 1201 条款而被下架的代码库都进行人工技术和法律审查。这一事件促成了 yt-dlp 的诞生。这个新分支的代码库在下架三天后就出现在了提交历史记录中。当时没有人知道 GitHub 是否会撤回下架决定。开发者们需要一份保障。
在 Windows、macOS 和 Linux 上安装 yt-dlp
人们常常忘记安装的后半部分,然后纳闷为什么合并步骤会崩溃。yt-dlp 本身当然可以从任何支持的站点拉取单个视频流。但要同时获得最佳视频和最佳音频呢?嵌入章节?mp4 重封装?所有这些都需要 `ffmpeg` 和 `ffprobe` 来完成。如果跳过这两个程序,你第一次尝试运行 `bv*+ba/b` 时,程序会输出一些莫名其妙的信息然后崩溃。所以:每次都要安装这两个程序。
对于 Windows 系统,我推荐使用 winget。运行 `winget install yt-dlp.yt-dlp`,然后再运行 `winget install Gyan.FFmpeg`。如果你已经在使用 Scoop,它也能正常工作;Chocolatey 也行。如果你觉得使用包管理器有点多余,GitHub Releases 上就有独立的 `yt-dlp.exe` 程序——把它放到一个文件夹里,把这个文件夹添加到 PATH 环境变量里,就搞定了。
Mac 用户可以使用更简单的版本。`brew install yt-dlp ffmpeg`。一行命令即可。搞定。
Linux 发行版的情况有所不同。Debian 的主软件包仓库中包含了 yt-dlp。Arch 将其保存在 `extra` 目录中。Fedora 则通过标准渠道获取。问题在于时间:当 YouTube 出现故障时,发行版的更新往往会滞后几天。一个权宜之计是安装 Python,这是在修复发布后当天下载视频的最佳方法:在任何安装了 Python 3.9 或更高版本的系统上运行 `python -m pip install -U yt-dlp`。该命令还会进行原地升级。文档中仍然保留了 curl 和 chmod 选项(`sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp && sudo chmod +x /usr/local/bin/yt-dlp`),但只有在没有其他包管理器可用时才建议使用此方法。
安装完成后,`yt-dlp -U` 会更新 pip 和二进制文件的副本;它有意跳过包管理器副本。选择一种安装方法并坚持使用。ffmpeg 和 ffprobe 必须搭配使用,不可更改。
您实际会用到的基本 yt-dlp 命令
最简明的速查表很简单。最基本的命令 `yt-dlp URL` 就能满足大多数常见情况。除此之外的所有操作只需要一两个参数。
在抓取 YouTube 视频之前,运行 `yt-dlp -F URL` 来查看有哪些格式可供选择。输出结果会列出提取器找到的所有视频格式、音频流和预合并流,以及相应的编解码器和文件大小。大多数人会直接使用 `yt-dlp -f "bv*+ba/b" URL`。这个选择器表示“最佳视频加最佳音频,如果两者无法分离,则回退到最佳合并流”。这是 yt-dlp 的核心格式选择语法,值得记住。添加 `--merge-output-format mp4` 可以强制使用 mp4 容器;添加 `-x --audio-format mp3` 则只提取音频。对于字幕,`--write-subs --sub-langs en` 会抓取官方字幕,而 `--write-auto-subs` 会在没有人工字幕时回退到自动生成的字幕。
对于列表,`-a urls.txt` 参数会逐行读取一个 URL,这是一次性下载多个视频的标准方法。`--playlist-items 1-10,15,20-` 参数可以对播放列表进行切片。`--download-archive seen.txt` 参数会记录已完成的下载,以便重复下载时跳过已下载的内容。下载存档是增量下载整个播放列表和频道的最简洁方法,无需重复下载。输出文件名遵循模板。字符串 `-o "%(channel)s/%(upload_date>%Y-%m-%d)s — %(title)s.%(ext)s"` 会在您选择的文件夹中生成按日期和频道分组的文件名。此结果与 Plex 和 Jellyfin 媒体库兼容。`-P` 参数用于更改目标目录。`--restrict-filenames` 参数用于确保跨文件系统的兼容性,将文件名限制为 ASCII 字符。 `--print filename` 参数会在下载过程开始前预览 yt-dlp 将要写入的内容。
如果下载过程中“播放而不是下载”,那是因为你的浏览器在 yt-dlp 检测到链接之前就打开了它。请将 URL 作为参数直接传递,或者用引号括起来,然后从终端运行 yt-dlp。
高级用户功能:后处理器、赞助商拦截、Cookie
除了基本功能之外,yt-dlp 还拥有极其丰富的特性。以下列出的功能在实际应用中最为重要。
| 类别 | 旗帜 | 使用 |
|---|---|---|
| 格式化排序 | `-S "+size,+br,res:1080"` | 1080p分辨率下,文件大小最好较小。 |
| 后处理 | `--embed-thumbnail --embed-metadata --embed-chapters --embed-subs` | 将封面图、标签、章节和字幕嵌入到文件中 |
| 赞助商栏 | `--sponsorblock-mark all` / `--sponsorblock-remove sponsor,selfpromo` | 在 YouTube 视频中标记或剪掉赞助商部分 |
| 验证 | `--cookies-from-browser firefox` | 使用浏览器 Cookie;支持 Chrome、Brave、Edge、Safari、Opera、Vivaldi、Chromium 和 Whale。 |
| 现场录制 | `--live-from-start --hls-use-mpegts` | 即使你迟到,也能从一开始就录制直播。 |
| 速度 | `--concurrent-fragments 8` | 并行 HLS 或 DASH 片段下载 |
| 外部下载器 | `--downloader aria2c` | 手动将数据传输给 aria2c 以实现并行处理 |
| 插件 | `~/.yt-dlp/plugins/` | 即插即用的自定义提取器和后处理器 |
SponsorBlock 集成非常实用。该选项会调用 SponsorBlock 社区数据库,它可以标记 YouTube 视频中的章节标记,或者直接删除视频中的赞助商部分。`--cookies-from-browser` 选项会读取浏览器配置文件(包括 Firefox 容器)中的 cookie,这是下载任何需要付费或登录才能访问的内容的最简洁方式。对于 TB 级的长时间运行的存档文件,外部下载器切换到 aria2c 可以显著提升 TCP 窗口机制成为瓶颈的网络环境下的下载速度。`--split-chapters` 选项会将视频内容按章节分割成单独的文件,这在一次上传包含多个演讲时非常方便。yt-dlp 还支持 `--video-multistreams` 选项,用于合并网站提供的多个视频轨道,尽管这种情况并不常见。
插件系统值得单独介绍。yt-dlp 会自动发现位于 `~/.yt-dlp/plugins/` 目录下的 Python 模块(或通过 `pip` 安装的、以 `yt-dlp-plugins` 为入口点的模块),并将其加载为提取器或后处理器。这样一来,一些特殊的网站无需等待上游补丁即可获得支持。下文讨论的 PoToken 提供程序插件也是通过这种方式接入的。
2025-2026 年 PoToken 和 SABR 的情况
YouTube 在 2025 年让 yt-dlp 的运行变得更加困难。其中两项改动导致原本运行良好的安装可能在 2026 年突然出现故障。
PoToken 是更重要的。现在每个视频请求都需要一个来源证明令牌 (Proof-of-Origin Token)。该令牌与视频绑定,过期时间短,并且与会话绑定。手动提取令牌的方法几个月前就失效了。目前有效的方法是运行一个名为 `bgutil-ytdlp-pot-provider` 的辅助工具;它可以按需生成令牌,而主 yt-dlp 调用会自动获取这些令牌。yt-dlp wiki 上有一个名为“PO Token Guide”的指南,详细介绍了设置过程。如果没有这个辅助工具,请求会被降级或直接阻止,即使是 30 秒前在浏览器中播放过的视频,yt-dlp 也可能无法正常工作。
SABR 是第二个问题。SABR 是 YouTube 的服务器端自适应比特率 (Server-side Adaptive Bitrate) 技术,到 2025 年,`web` 提取器开始返回仅支持 SABR 格式的视频,这会破坏正常的下载路径。通常的解决方法是使用提取器参数提示,并配合已登录浏览器的 cookie。在修复方案完善之前,值得关注的讨论帖包括 #12482、#14307、#14390、#16082 和 #13968。最终结果是:yt-dlp 仍然可以处理绝大多数公开的 YouTube 内容,但到 2026 年,原本“开箱即用”的命令往往需要“PoToken 提供程序、新的 cookie 以及一点耐心等待”。

yt-dlp 2026 年的法律地位:美国、德国、欧盟
从法律角度来看,这是管辖权问题,而关键在于,这个问题尚未得到最终解决。
在美国,尚无法院就 yt-dlp 做出过具体裁决。2020 年美国唱片业协会 (RIAA) 的案例是最接近的先例,最终以非司法推翻判决告终。美国版权局第九次三年期第 1201 条款最终规则于 2024 年 10 月 28 日生效,有效期至 2027 年 10 月 28 日。该规则延续了之前的豁免条款,并新增了一项针对人工智能可信度研究的豁免,但并未针对个人视频存档设立普遍适用的规避豁免。第 1201 条款的结构性问题依然存在,即无论意图如何,只要涉及数字版权管理 (DRM) 的工具都会被定为犯罪。
在德国,此次诉讼的焦点在于托管责任,而非软件本身。2024年11月27日,汉堡高等地区法院驳回了美因茨托管商Uberspace(youtube-dl.org的托管商)的上诉。该裁决最终确认了下级法院2023年的一项判决,即托管商可能对提供规避工具的网站承担责任。该原则并未直接禁止yt-dlp,但对于任何公开宣传规避功能的网站而言,在德国托管都存在风险。
在欧盟层面,《数字服务法》规范了通知和移除程序(第16-17条),但并未对下载器软件进行监管。目前欧盟范围内没有强制托管商屏蔽yt-dlp的规定。在任何司法管辖区,个人使用yt-dlp处理自己的内容都不是法律上的重点。同样,如果内容创作者已授权,情况也是如此。真正的问题在于内容分发以及与流媒体保护机制的交互。
GUI前端和更广泛的下载器生态系统
并非所有人都需要终端,而且 yt-dlp 的命令行界面也并非其市场优势。yt-dlp 只是众多视频下载器之一,但它作为底层引擎运行在大多数现代视频下载器的图形用户界面 (GUI) 中。Stacher 是目前最完善的跨平台 GUI。Tartube 是一个基于 Python/GTK 的替代方案。yt-dlg 是专门为 yt-dlp 开发的社区分支。Tube-Archivist 是一个用于频道存档的自托管 Docker 服务器;它可以按计划从各种网站下载视频。YTDL-Material 是一个自托管的 Web 前端。ytdl-sub 是一个声明式 YAML 配置工具,在 Plex 和 Jellyfin 自托管用户中很受欢迎。JDownloader 2 通过插件集成了 yt-dlp。每个工具都提供了自己的视频选择界面和下载选项面板,但繁重的计算工作都由 yt-dlp 完成。
| 工具 | 状态(2026 年) | 范围 | 执照 |
|---|---|---|---|
| yt-dlp | 活跃的,每周发布 | 1800多个视频/音频网站 | 无证 |
| youtube-dl | 速度慢,上次发布时间是2021年9月 | YouTube 及约 1000 个网站 | 无证 |
| gallery-dl | 积极的 | 图片库;可调用 yt-dlp 播放视频 | GPLv2 |
| Streamlink | 积极的 | 传输到播放器的直播流 | BSD-2 |
简洁规则:yt-dlp 用于存档下载,streamlink 用于实时播放到播放器,gallery-dl 用于图片较多的网站。
安全提示:哪里可以下载 yt-dlp 以及如何识别假冒产品
唯一安全的来源是 GitHub Releases、PyPI(`pip install yt-dlp`)、官方发行包以及主流的 Windows 包管理器(Winget、Scoop、Chocolatey)。第三方“yt-dlp 下载器”网站通常会捆绑广告软件、挖矿程序或修改过的二进制文件。Windows Defender 曾多次将 PyInstaller 打包的 `yt-dlp.exe` 标记为 `Trojan:Win32/Wacatac.B!ml`(参见问题 #7532 和 #15415)。这些都是启发式误报,签名库通常会在几天内清除。像 yt-dlp 这样的小型开源项目依靠志愿者维护。通过 Plisio 等支付网关进行加密货币捐赠是国际贡献者获得支持的一种不易被银行拦截的方式。
举个例子。假设你想下载一个 YouTube 视频到电脑上用于演示。命令是 `yt-dlp -f "bv*+ba/b" --merge-output-format mp4 URL`,这样就能得到正确的下载格式。yt-dlp 是 youtube-dl 的一个分支,它拥有比 youtube-dl 更多的提取器,并且有很多提取器可以让你下载到原版 youtube-dl 无法下载的视频。yt-dlp 通过其插件系统支持各种小众资源,并且允许在需要从不同网站下载视频时使用 `-a urls.txt` 参数。yt-dlp 支持的所有网站都列在 `supportedsites.md` 文件中。