用视频下载神器 yt-dlp 轻松下载高清视频
一、为什么需要专门的解析工具?
下载网页里的视频,最容易想到的办法是:先播放,再找到浏览器正在请求的媒体地址,把它下载下来。但真正动手时,会遇到几个问题。
播放页面的地址不等于视频文件的地址。播放器可能要先请求接口,才能取得媒体信息,直接查看网页源码未必能找到。找到资源后,也可能发现视频按片段传输,或者画面和声音分开提供。下载请求还可能依赖 Cookie、Referer 等信息,单独复制链接不一定能用。
这些线索可以从浏览器开发者工具的 Network(网络)面板中找:播放视频时,观察资源地址、请求头和接口返回内容。所谓“嗅探”,就是从网络请求中寻找媒体资源,再判断怎样发起同样的请求。
我们先自己找一次。以 B站为例,打开 Network 面板,播放视频,再用 m4s 筛选请求。点击其中一条,查看它的地址和请求信息:

图中的 Range: bytes=0-4024 表示,浏览器这次只请求了资源开头的 4025 字节;
Content-Range 则显示,这个资源总共有约 436.5 MB。这说明播放器正在按字节范围读取资源。
地址找到了,接下来还得确认:它是否包含声音,下载是否需要额外的请求头,音视频分开时又该怎样合并。
要让这些操作自动完成,就得把分析得到的网站规则写成程序:从哪里取得视频标识、调用哪个接口、携带哪些参数,以及怎样读取返回结果。各家网站需要分别适配;网站改了接口,解析代码也可能要跟着改。
这正是 yt-dlp 的主要价值。它会识别网站、解析媒体信息、选择格式,再下载文件,必要时调用 FFmpeg 合并音视频。

其中,适配网站、提取媒体信息的工作,主要由 Extractor(提取器) 完成。它按各个网站的规则,从页面或接口中取得资源地址、清晰度、编码和音轨等信息,交给后续流程选择和下载。例如,B站提取器就要处理请求头、登录状态和签名参数。
提取器把针对网站的分析结果变成了可重复执行的解析流程。 用户不必每下载一个视频,就重新寻找接口、辨认音视频流;网站规则变化后,也可以通过更新提取器来适配。
接下来实际下载一个视频。下面以 Windows 为例,先准备 yt-dlp 和负责合并音视频的 FFmpeg,再从一条最简单的命令开始。
二、在 Windows 上准备运行环境
1. 下载安装
Windows 用户可以从 yt-dlp 的 GitHub Releases 下载适合系统的独立可执行文件,不必另装 Python。
下载地址:https://github.com/yt-dlp/yt-dlp/releases

下面以 yt-dlp.exe 为例。在程序所在目录打开 PowerShell,运行:
1 | # 验证 |
能显示版本号,就说明程序可以启动,版本号以实际安装为准。这里的 .\ 表示当前目录,也可以改用程序的完整路径。我习惯把个人命令行工具放在:
1 | %USERPROFILE%\.local\bin |
其中 %USERPROFILE% 表示当前用户的主目录,例如 C:\Users\chris。.local\bin 只是一个便于统一管理工具的目录名,在 Windows 中没有特殊作用,关键是配置 PATH。
创建这个目录,把 yt-dlp.exe 放进去,然后在“系统属性 → 高级 → 环境变量”中,编辑用户变量里的 Path,新增上述路径。若在 PowerShell 命令中引用这个目录,应写成 $env:USERPROFILE\.local\bin,不要直接照搬 %USERPROFILE%。
保存环境变量后,关闭并重新打开终端,让新的 PATH 生效。之后就可以在任意目录直接运行 yt-dlp。
2. 为音视频合并准备 FFmpeg
yt-dlp 能启动后,还需要准备 FFmpeg。前面提到,视频网站常把画面和声音分开提供;下载完,要靠 FFmpeg 把两者合成一个有画面、有声音的文件。
下载地址:https://www.gyan.dev/ffmpeg/builds/
选择静态构建即可,Essentials 通常就能满足本文的合并和转封装需求,下面的截图使用 Full。下载解压后,把 bin 目录中的 ffmpeg.exe 和 ffprobe.exe 放进前面已加入 PATH 的目录。

在重新打开的终端中检查:
1 | ffmpeg -version |
两条命令都能显示版本信息,就说明终端可以找到这两个程序,版本号以实际安装为准。
三、先用最简单的命令下载
环境准备好后,先运行:
1 | yt-dlp "URL" |
将 URL 换成实际的视频页面地址,保留引号。yt-dlp 会解析资源并按默认策略选择格式,需要合并时调用 FFmpeg。
例如,下载 B站的“2026日漫《名侦探柯南:30号杀人事件》”,可以运行:
1 | yt-dlp "https://www.bilibili.com/video/BV1b1a767EGh/" |
这条命令能满足需求时,就可以结束了。遇到清晰度不够、缺少格式等情况,再往下排查。
四、下载的视频清晰度不够怎么办?
清晰度不够,先看看 yt-dlp 解析到了哪些格式。大写 -F 可以列出它们:
1 | yt-dlp -F "URL" |
列表通常会显示格式 ID、分辨率、帧率和音视频编码。还可能出现两个标记:
| 标记 | 含义 |
|---|---|
video only |
只有画面,没有音频 |
audio only |
只有音频,没有画面 |
单独下载 video only 格式不会有声音,还需要选择音频流,再用 FFmpeg 合并。
下图的格式列表中包含 360p、480p、720p、1080p 等视频格式,以及单独的音频格式。本次示例中,网页登录后可见的 1080P 高码率选项没有出现在列表里。下一节会带上登录信息再检查一次。

目标格式没列出来,要检查解析结果和访问条件;列出来却没被选中,要检查选择规则。格式出现在列表中,也不保证下载一定成功,仍要以实际请求结果为准。
五、需要登录的视频怎么下载?
浏览器里能播放的清晰度,-F 却没列出来,可能是因为浏览器已经登录,而 yt-dlp 没有携带登录信息。
这时可以让它读取浏览器中的 Cookie,再查看一次格式:
1 | yt-dlp --cookies-from-browser chrome -F "URL" |
使用 Edge 时,把 chrome 换成 edge。先在对应浏览器中登录该网站,成功读取 Cookie 后,再对比两次的格式列表,看看是否多出了选项。
读取 Cookie 也可能失败。Windows 上的 Chrome 常见以下两类报错。
错误一:无法复制 Cookie 数据库
报错中会出现 Could not copy Chrome cookie database,并附上问题链接:https://github.com/yt-dlp/yt-dlp/issues/7271

常见原因是 Chrome 仍在运行,占用了 Cookie 数据库。如果是这种情况,完全退出 Chrome,包括后台进程,再重试。
错误二:Cookie 解密失败
报错中会出现 Failed to decrypt with DPAPI,并附上问题链接:https://github.com/yt-dlp/yt-dlp/issues/10927
这次数据库已经能读取,但其中的 Cookie 是加密保存的,yt-dlp 调用 Windows 的 DPAPI 解密时失败了。这类错误未必能靠关闭浏览器解决。

可以在 Firefox 登录同一网站后尝试 --cookies-from-browser firefox,也可以从 Chrome 导出 Cookie 文件。下面以 Cookie-Editor 扩展为例,选择 Netscape 格式导出:

将导出内容完整保存为 cookies.txt,保留首行的 # Netscape HTTP Cookie File 或 # HTTP Cookie File 标识。然后在该文件所在目录打开终端,运行:
1 | yt-dlp --cookies ".\cookies.txt" -F "URL" |
这里的 .\cookies.txt 指当前终端所在目录中的文件;如果文件保存在其他位置,就改成它的完整路径。后文的 B站示例沿用这个文件名。
在本次示例中,携带登录 Cookie 后,格式列表出现了此前缺失的选项:

Cookie 用于携带已有的登录状态;能访问哪些格式,仍取决于账号权限和网站返回的结果。
目标格式列出来后,去掉 -F 就能按默认规则下载。要指定其中某个格式,则需要下一节的 -f。
六、怎么选择下载格式?
1. 用 -f 选择视频和音频
前面用大写 -F 查看格式,接下来用小写 -f 选择要下载的格式。
对于分开的音视频,可以从列表中各选一个格式 ID:
1 | yt-dlp -f "视频格式ID+音频格式ID" "URL" |
把占位文字替换为 -F 列表中的实际 ID,yt-dlp 就会下载对应的音视频并调用 FFmpeg 合并。如果所选格式已经同时包含画面和声音,只写这一个格式 ID 即可。需要登录时,继续带上前面使用的 Cookie 参数。
不同视频的格式 ID 可能不同。想让同一条命令适用于多个视频,可以改写成选择规则:
1 | yt-dlp -f "bv*+ba/b" "URL" |
这个表达式可以拆成几部分:
| 写法 | 含义 |
|---|---|
bv* |
最佳的含视频格式,也可能已经包含音频 |
ba |
最佳纯音频格式 |
+ |
组合多个格式,通常需要 FFmpeg 合并 |
/ |
前面的选择不可用时,尝试后面的选择 |
b |
最佳的同时包含视频和音频的单一格式 |
“最佳”由工具的格式排序规则决定。上面的表达式优先选择 bv*+ba,没有匹配格式时才尝试 b;下载或合并报错后,不会因此自动改用 b。
bv* 允许所选格式自带音频,bv 则只选纯视频格式。如果 bv* 已经带有音频,默认不会再加入 ba 音轨,所以不一定会下载两个文件再合并。
日常下载通常交给默认策略就够了,了解这条规则后,需要时再调整。
2. 怎么保存成 MP4?
下载 YouTube 视频时,得到的文件可能是 WebM。想保存成 MP4,可以用官方预设:
1 | yt-dlp -t mp4 "URL" |
-t mp4 会优先考虑 H.264 视频和 AAC 音频,并设置合并或转封装为 MP4。它侧重播放兼容性,因此选中的清晰度可能与默认下载不同。
MP4 是封装音视频的容器,H.264、AAC 则分别是视频和音频编码。-t mp4 会调整选择偏好,但不会强制把其他编码转换成 H.264 和 AAC。
另一个参数 --merge-output-format mp4 只指定合并时的容器,不需要合并时就不起作用。-t mp4 还包含转封装设置,因此希望最终得到 MP4 时,用它更方便。两种方式都要求所选音视频编码能装进 MP4 容器。
需要登录时,可以配合前面导出的 Cookie 文件:
1 | yt-dlp --cookies ".\cookies.txt" -t mp4 "URL" |
七、怎么用 yt-dlp 下载 B站和 YouTube 视频?
下面以 B站和 YouTube 为例,把前面的命令串起来。
1. 下载 B站视频
下面的 BVxxxxxxxx 是占位符,使用时换成实际视频的 BV 号。先直接下载:
1 | yt-dlp "https://www.bilibili.com/video/BVxxxxxxxx" |
如果清晰度不符合预期,查看格式列表:
1 | yt-dlp -F "https://www.bilibili.com/video/BVxxxxxxxx" |
如果目标清晰度在已登录的浏览器中可用,却没有出现在列表里,再带上登录状态检查:
1 | yt-dlp --cookies ".\cookies.txt" -F "https://www.bilibili.com/video/BVxxxxxxxx" |
格式列表符合预期后,去掉 -F,就会按默认规则下载;要指定格式,再按第六节的方法添加 -f。下面这条命令则使用 MP4 预设:
1 | yt-dlp --cookies ".\cookies.txt" -t mp4 "https://www.bilibili.com/video/BVxxxxxxxx" |
这些命令按需要使用,第一条能满足需求就不必继续加参数。
主要下载 B站视频的话,也可以试试专用的 GUI 工具,在图形界面里选择清晰度和下载内容就行,我平时也会用。
例如bilidown 这款GUI工具

2. 下载 YouTube 视频
YouTube 也一样。把 URL 换成视频地址,使用 MP4 预设下载:
1 | yt-dlp -t mp4 "URL" |
如果出现 No supported JavaScript runtime could be found,表示 yt-dlp 没找到执行 YouTube JavaScript 校验所需的运行时,部分格式可能因此无法解析。
解决办法是从 Deno 官方安装页面下载安装 Deno,将 deno.exe 放进前面已加入 PATH 的 .local\bin,重新打开终端检查:
1 | deno --version |
能显示 Deno 版本号后,再执行一次下载命令。yt-dlp 默认会启用 Deno,官方 yt-dlp.exe 已包含配套解析脚本,无需另装。
普通公开视频可以先不带 Cookie;需要登录才能访问的内容,再添加 --cookies ".\youtube-cookies.txt"。这里应使用从 YouTube 导出的登录信息,B站的 Cookie 不能代替。
八、还能下载哪些网站的视频?
除了 B站和 YouTube,官方列表中还有腾讯视频、爱奇艺、Vimeo、Dailymotion 等网站的提取器。对于已经适配的网站,通常也是把视频页面地址交给 yt-dlp 即可。
有对应提取器,并不代表站内所有内容都能下载。实际结果还取决于账号权限、地区限制和网站接口是否发生变化,可以先用 yt-dlp -F "URL" 查看解析结果。
网站接口会变,Extractor(提取器) 也要跟着维护。新版本会修复解析问题,也可能增加网站支持和其他功能。本文使用的官方独立可执行文件,可以直接更新:
1 | yt-dlp -U |
-U 会更新到当前发布渠道的最新版本,一并获得已经发布的提取器修复和新增功能。一条以前能用的命令突然解析失败时,可以先更新,再试一次。