先放一个结论:2026年,B站视频下载的核心思路并没有变,无非是“拿地址、拉数据、拼文件”,但B站这几年把前端签名和接口换了好几轮,很多过去的神器已经废了。我这两年在自己的电脑和备用机上反复试过各种方案,最终留在手边的就两个:一个是零安装的浏览器开发者工具手动抓流,另一个是开源命令行工具批量下载。前者适合临时救急,后者适合收藏整季整P的内容。这篇文章就把两个方法从头到尾盘一遍,包括具体步骤、参数选择和踩坑记录,保证你照着做能跑通。
1. 动手之前:先搞清楚B站视频为什么不让你“右键另存”
很多人第一次想下载B站视频,都会习惯性右键,结果发现只有一个“复制视频地址”,并没有“另存为”。这不是B站故意跟用户过不去,而是视频分发方式决定的。
B站的视频不是一个大文件,而是被切成了几百上千个小片段,播放器边播边拼。这种技术叫HLS分片或DASH流,目的是让拖动进度条更流畅、清晰度切换更即时。所以你在网页上看到的那个视频地址,其实是一个播放列表入口,里面全是小分片的动态链接,这些链接往往还有过期时间。想下载,本质就是把这些分片全部拉下来,再按顺序拼成一个完整文件。
到了2026年,B站又加了几层东西:访问视频详情页需要带签名参数,播放链接需要带正确的Referer和User-Agent,有些视频甚至要求登录才能看到最高清晰度。这就导致很多老办法失效,比如直接复制“视频地址”用下载器抓,或使用很久没更新的第三方插件。但核心链路仍然有规律可循,我们下面讲的两个方法,就是把手动抓取和工具自动抓取这两条路跑通。
1.1 一个简单比喻理解B站视频结构
可以把B站视频想象成一本几百页的装订书。网页播放器拿到的是“目录页”,上面写明了每一页在哪一个储物柜存储、编号是什么。播放器每翻一页,就去对应柜子取一页,拼成你看到的内容。直接右键的“复制视频地址”相当于只复制了目录页开头,真正的每一页内容并不会跟着过来。
下载工具要做的,就是拿着这个目录,按顺序把所有页都取出来,再重新装订成一本完整的书。B站为了避免你轻松取走整本书,会让每个储物柜的地址上附加一次性令牌,并且校验访问者身份(比如是否携带了所在网页的Referer)。所以手动抓流时,漏掉任何一层校验,下载回来的就是403错误页面。
1.2 下载前必须确认的三件事
动手之前,先花十秒确认这几个问题,能省掉后面一半的坑。
第一,确认用途。个人学习、备份、二次创作剪辑,这类用途通常没有问题。但把下载的视频去水印后重新上传到平台、打包出售或搬运牟利,属于明确的侵权行为,不出事只是概率问题。建议下载前先看视频页面的版权提示,尊重创作者授权范围。
第二,确认账号状态。不是所有视频都能以游客身份下载。如果你的目标清晰度是1080P或更高的高码率模式,通常需要登录账号才能获取播放链接。如果你要下载的是“横屏4K”或“高码率”视频,甚至需要对应画质权限。所以提前确认你能不能在浏览器里正常播放这个视频,能播到哪一档清晰度,下载通常也能达到那一档。
第三,确认是否需要弹幕和字幕。很多人的需求不只是视频画面,还想留弹幕。这两个方法都能处理弹幕,但处理方式略有差异:手动抓流只能抓画面和声音,弹幕需要额外请求;命令行工具则可以一键把弹幕写成独立文件。先想清楚需求,再选方法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方法一:不装软件,用浏览器开发者工具手动抓视频流
这是我最早用的方法,也是应急情况下最可靠的方案。它的优点是完全不依赖任何第三方软件,只要有个浏览器就能干,而且因为所有操作都在你自己的浏览器里完成,登录状态、清晰度权限完全和你观看时一致。
2.1 手把手操作步骤:以Chrome或Edge为例
第一步,先确认你的浏览器能正常播放目标视频,并选择好清晰度。比如你想下载1080P,就先在播放器里把清晰度切成1080P,让播放器发出对应清晰度的请求。
第二步,在视频页面按下F12打开开发者工具,切换到“网络”标签页,英文界面是Network。在筛选框里输入“media”并回车,这个操作会把请求列表过滤成媒体文件,过滤掉一大堆JavaScript、图片和接口请求。
第三步,按F5刷新页面重新加载视频。刷新后,列表里会出现几行“m4s”或“mp4”开头的请求,其中有些文件名很长,字符杂乱,但类型显示为media或mpeg。这些就是真正的视频分片或音视频流地址。通常你会看到两个关键请求:一个对应视频画面,一个对应音频。因为B站的高清晰度版本采用DASH流,画面和声音是分开传的。
第四步,点击你认为最大的那一个media请求,右侧会弹出详细信息面板。重点关注“请求URL”这一项,这就是我们要的地址。右键复制完整URL。音频请求同理,在另一个media请求里拷贝。
第五步,用工具下载这两个地址。直接在新标签页打开URL通常会失败,因为缺少视频页面的Referer信息。这里有个更稳妥的方式:打开系统的命令行终端,使用curl命令,把Referer带上。命令格式如下:
bash复制curl -e "https://www.bilibili.com/video/你的视频ID" "视频完整URL" -o video.m4s
如果你的电脑没有安装curl,也可以用支持自定义Referer的下载工具,比如图形化的IDM或NeetDownloadManager。但这类工具不在我们“零安装”的范围内。所以更简单的做法是:先用浏览器打开视频页面,再在开发者工具里找到地址,然后在电脑上安装一个能填Referer的下载插件。不过这样就绕远了,我更推荐直接用命令行。
第六步,下载完视频和音频后,需要把它们合并成一个文件。这里建议安装FFmpeg,然后把下面这条命令保存成顺手的方式:
bash复制ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4
这条命令不会重新编码,只是把两路流封装进一个MP4容器里,速度很快。如果一切正常,你会在当前目录得到一个带声音的完整视频。
2.2 手动抓流的适用场景和几个大坑
这个方法最实用的场景是:你只是偶尔下载某一个视频,而且不想为这个需求专门安装一套工具。它也是排查问题时的利器,因为你能清楚看到播放器究竟请求了哪些地址,也方便理解为什么某些工具会失效。
但它有几个明显的坑,我一个个说清楚。
第一个坑:很多人会把“复制视频地址”当成“复制播放链接”,在开发者工具里找半天也找不到media请求。记住筛选条件是media,不是全部请求。如果刷新后还是看不到,试试在筛选框里输入“m4s”,或者直接看“类型”列,找到“media”或“mpeg”项。
第二个坑:复制下来的URL打开后返回403。这是因为浏览器新标签页不会自动带上视频页面的Referer,而B站会根据Referer判断请求来源是否合法。这就是为什么上面特意强调要用curl设置-e参数,或者在下载工具里填Referer。
第三个坑:下载下来的音频或视频长度对不上。通常是因为你在页面切换了清晰度,导致音视频请求来自不同码率档位。解决办法是刷新页面后立即固定清晰度,然后分别找该清晰度下对应的音视频请求。
第四个坑:手动抓流没有断点续传,也几乎没有进度展示。如果网络不好,一个大断点可能让你白等。所以这个方法只推荐给目标文件不太大的视频,或者你只是想拿一个短视频,而不是整部几个小时的课程。
3. 方法二:用开源命令行工具批量下载,一条命令搞定整季内容
如果上面手动抓流是“自己下厨”,那么用开源命令行工具就是“请了个专业厨师”。它的核心价值在于:自动解析页面里的所有分片地址、自动下载并合并音视频、自动处理登录和清晰度、支持整个合集或分P批量处理。我用下来最省心的工具是yt-dlp,这个项目一直在更新,对B站的适配也保持得不错。
3.1 安装与第一条命令:从“能用”到“好用”
先说安装。Windows用户可以去yt-dlp的GitHub Releases页面下载对应的exe文件,下载后放到任意文件夹,并把该文件夹加入系统的Path环境变量。macOS或Linux用户可以使用包管理器安装,比如macOS用Homebrew,命令是brew install yt-dlp;Debian系Linux可以用apt install yt-dlp,不过版本可能偏旧,我更建议直接用Python的pip安装,这样能随时更新。
如果你不确定自己的电脑上有没有yt-dlp,打开终端输入:
bash复制yt-dlp --version
看到版本号就说明已经装好了。接下来我建议顺手把FFmpeg也装上,因为yt-dlp合并音视频时会调用它。Windows用户可以从FFmpeg官网下载编译好的release版本,解压后将bin目录加入Path。验证方式是在终端输入ffmpeg -version,如果能输出版本信息就说明环境没问题。
安装之后,第一条命令可以非常简洁:
bash复制yt-dlp "视频页面完整URL"
注意URL要带引号,尤其是链接后面带有查询参数时。执行后yt-dlp会自动解析页面、查询最高清晰度、下载音视频流并合并。第一次运行会看到类似[info]和[download]的日志,进度条会显示百分比。
我第一次用的时候,就遇到一个常见问题:默认下载到的文件里没有声音。这是因为yt-dlp可能优先下载了视频画面流,但音频流下载失败或被忽略。解决办法是显式告诉yt-dlp需要下载最佳画质且同时包含音频的最佳组合,命令是:
bash复制yt-dlp -f "bv*+ba/b" "视频页面URL"
bv*表示最佳画质的视频流,ba表示最佳音频流,+表示合并,/后面的b表示如果合并不可用,就退而求其次选择最佳的综合格式。这个参数组合基本适合绝大多数B站视频。
3.2 进阶配置:批量处理多P、字幕和弹幕
B站视频经常一个稿件事分P形式,或者是一个多集合集。yt-dlp默认会下载整个页面里的所有视频,包括所有分P。如果你只想下载某一个分P,比如第3P,可以在链接后面加播放列表范围:
bash复制yt-dlp --playlist-items 3 "带多P的视频URL"
如果是第1到第3P:
bash复制yt-dlp --playlist-items 1-3 "带多P的视频URL"
这个参数对合集非常有用。比如一套系列教程有100P,你只需要前10P来学习某个章节,就可以指定1-10,省下大量流量和时间。
除了画面和声音,B站视频常常还有字幕以及弹幕。yt-dlp支持直接下载字幕和弹幕文件,这样即使原视频被下架,你仍然保留文本记录。常用的组合是:
bash复制yt-dlp --write-sub --write-auto-sub --sub-langs all --write-danmaku "视频URL"
--write-sub下载手动上传的字幕,--write-auto-sub下载自动生成的字幕,--sub-langs all表示下载所有语言,--write-danmaku则是把弹幕保存为XML格式的弹幕文件。弹幕文件本身不能直接叠加到MP4画面上,但可以在播放器中加载,比如使用本地弹幕播放器或剪辑工具导入。
如果你想控制文件输出路径和文件名,可以用-o参数。例如:
bash复制yt-dlp -o "%(title)s.%(ext)s" "视频URL"
这会以上传者标题作为文件名。更好的方式是用%(title)s_%(id)s来避免同名文件覆盖,因为我遇到过多个视频标题相同导致文件被覆盖的尴尬。
3.3 关于画质与登录:为什么我推荐绑定cookies
B站不少高清晰度视频需要登录账号才能获取播放链接。yt-dlp虽然可以用游客身份下载,但不到万不得已,你很可能只能拿到720P甚至更低的高清档位。想下1080P及以上,必须让yt-dlp使用你的登录状态。
最方便的绑定方式是从浏览器读取cookies。如果你用的是Chrome,可以这样:
bash复制yt-dlp --cookies-from-browser chrome "视频URL"
执行后yt-dlp会尝试读取Chrome的cookies数据库。注意:读取Chrome的cookies需要浏览器处于完全关闭状态,否则数据库会被锁定。如果读取失败,可以先退出Chrome再试一次。
对于Edge浏览器,参数换成:
bash复制yt-dlp --cookies-from-browser edge "视频URL"
如果是Firefox,则是:
bash复制yt-dlp --cookies-from-browser firefox "视频URL"
我在使用过程中踩过一次坑:系统浏览器版本升级后,yt-dlp读取cookie时报错“无法解密cookies”。那时候最简单的解决方案是把cookies导出成文本文件,再用--cookies参数指定:
bash复制yt-dlp --cookies cookies.txt "视频URL"
导出cookies文本文件的工具很多,这里不推荐具体的插件,你可以找一个能在浏览器扩展商店里方便使用的导出工具。但务必注意:cookies.txt相当于你账号的钥匙,绝对不能公开或发给别人。
绑定登录态后,下载清晰度会自动匹配你的账号权限。如果你有对应画质权限,yt-dlp默认会选择最高可用的画质;如果没有,就会选次高画质。
3.4 常见报错与排查速查表
我平时在帮助别人调试时,最常遇到的报错基本固定,整理成一张表方便你对照排查。
| 报错信息或现象 | 大概率原因 | 解决办法 |
|---|---|---|
| HTTP Error 403 Forbidden | 请求缺少Referer或User-Agent | 加上--referer "视频页面URL",或直接使用--cookies-from-browser chrome绑定浏览器环境 |
| Unable to extract initial state | B站前端结构改动,旧版本yt-dlp解析失败 | 运行yt-dlp -U升级到最新版 |
| Video unavailable / 需要登录 | 视频仅登录后可看 | 绑定cookies再下载 |
| Download failed: overlapping | 音视频流合并时文件时间戳有问题 | 先分别下载视频流和音频流,再用ffmpeg -i video -i audio -c copy手动合并 |
| ERROR: ffmpeg not found | 系统没有安装FFmpeg或没加入Path | 安装FFmpeg并确保ffmpeg -version可用 |
| 下载中途断掉 | 网络不稳定或分片获取超时 | 加--retries 10 --fragment-retries 10,如果经常断,建议降低并发数 |
特别说一下--retries这个参数。B站分片多,网络抖动时很容易有某个分片失败。默认重试次数可能不够,我习惯直接用:
bash复制yt-dlp --retries 10 --fragment-retries 10 --continue "视频URL"
--continue表示断点续传,这样即使中途失败,下次重新运行时可以接着下,不用从头再来。
4. 两个方法怎么选?我的经验与避坑总结
前两章把原理和方法都讲完了,这一章回到更实际的层面:到底什么时候用哪个方法,以及长期使用中会遇到哪些让人头疼的细节。
4.1 选择建议:分场景不纠结
我的使用习惯是:如果一个视频只有几分钟,而且是第一次试方法,直接用手动抓流。因为不需要装任何东西,适合用来理解视频流结构。如果我要下载一套教程、一个合集,或者一个超过半小时的完整视频,我直接上yt-dlp,因为手动抓流在半小时以上的视频里会遇到分片太多、手动复制URL容易出错、没有断点续传等问题。
再补充一点:如果你只是想在手机端离线看,那其实不需要折腾下载。B站客户端自带的缓存功能就能解决,画质和音画同步都由播放器负责,体验最稳定。但这不算严格意义上的“下载到文件”,因为缓存的路径和格式一般只能被自家播放器识别。所以标题里说的两个方法,主要还是面向那些想要独立视频文件的场景。
4.2 我实际操作中踩过的几个坑
第一个坑:把视频画面下下来了,结果没声音。这个问题我在初用yt-dlp时遇到,原因是默认的格式选择参数在同一画质下选了没有音频的视频流。解决方式就是前面提到的-f "bv*+ba/b",把视频流和音频流一起拉下来再合并。
第二个坑:用浏览器开发者工具抓流时,我抓的是“下载后的视频”还是“播放时的原始流”?很多人的误解在于,开发者工具中出现的media请求其实有两种,一种是真正的分片,另一种是下载播放列表文件。用筛选框过滤media后,找到的是分片请求,它通常以m4s或.mp4结尾,但不一定带有完整文件名。你需要看“请求URL”里的具体路径,如果里面包含blob:肯定是错的,只看到http或https开头的标准链接才对。
第三个坑:yt-dlp下载后文件名出现乱码或非法字符,尤其Windows环境下。这是因为视频标题里包含冒号、问号、竖线等Windows不允许的字符。解决办法是在-o参数里显式指定文件名格式,比如-o "%(title)s.%(ext)s"?其实这不会去除非法字符。更稳妥的是控制输出模板,使用-o "downloaded/%(id)s.%(ext)s",这样用视频ID作文件名,之后再自行重命名。我一般使用-o "%(title).80B.%(ext)s"来限制标题长度,并手动替换特殊字符。
第四个坑:更新工具后,以前保存的配置失效。yt-dlp的某些参数会随着版本调整而改变默认行为。比如旧版本默认会下载字幕,新版本可能需要显式添加参数。所以如果你长时间没更新,第一次报错先升级工具版本,往往能解决80%的问题。
4.3 关于版权和用途,再多说几句
不管是手动抓流还是命令行工具,本质都是在解决“如何把B站播放器已经加载过的数据保留成文件”。这个行为本身在技术上没有任何灰色地带,但在使用层面必须遵守规则。我个人坚持两条:第一,下载的视频只用于自己看,或者作为视频剪辑的二创素材,不会整段直接发布到其他平台;第二,如果视频明确标注“禁止转载”,我即使下载也不会分享出去。B站的创作者靠流量和激励生存,下载工具只是个人便利,不是攻击版权的外挂。
如果你要用下载的视频做商业项目,务必先和作者取得授权,或选择那些允许开放下载的素材或课程。
最后分享一个小技巧
写到这里,最后收个尾。我现在的习惯是给yt-dlp写一个简短的配置文件,放在用户目录下,这样平时就不用打一长串参数。配置内容大概如下:
bash复制# yt-dlp配置示例
-f bv*+ba/b
--merge-output-format mp4
--retries 10
--fragment-retries 10
--continue
--no-overwrites
--write-sub
--sub-langs all
配置文件命名为yt-dlp.conf,放在yt-dlp.exe所在目录或用户配置目录中。之后运行yt-dlp "视频URL"时,它会自动读取这些参数,命令变得很干净。如果你觉得某些参数不适合某个视频,在命令行临时加一个参数会覆盖配置文件中的对应项。
根据我个人经验,工具更新永远是第一优先级。每次B站页面或接口改动后,只要把yt-dlp更新到最新版,大多数问题都会迎刃而解。这套“手动抓流+命令行下载”的组合,我已经用了很久,目前依然没找到比它更省心、更可控的方案。希望这篇经验能帮你少走几条弯路,把需要的视频装进硬盘。
