☰
B站视频下载全方案:从DASH音画分离到yt-dlp批量保存完整指南
2026/10/16 12:56:56 网站建设 项目流程

看到这个标题点进来的朋友,估计都跟我一样,手头有一堆想看的CrashCourse速成课收藏夹吃灰,或者想系统地刷一遍某个学科,结果发现自己总是在线看一会儿就卡、想边看边记笔记又不方便、通勤路上没网就只能干瞪眼。这套“速成课”系列内容密度高、信息量大,非常适合集中学习,但也正因为每一集信息量太大,反而特别需要反复暂停、回放、截图做笔记。在线播放显然满足不了这种需求,于是“把视频下载下来慢慢啃”就成了一个很实际的选择。

这篇文章是我自己整理的一套完整操作笔记,覆盖了从B站下载这类视频的常见方案、背后原理、具体命令和踩坑记录。不管你是想用电脑批量下载整个分P合集,还是只想偶尔缓存几集到手机离线看,或者遇到下载总是失败的问题,这篇笔记应该都能给你一个靠谱的参考。

1. 下载前先搞懂:B站视频到底是怎么存的

很多人在下载B站视频时碰了一鼻子灰,主要问题不在于不知道怎么点下载按钮,而在于没搞懂B站视频在服务器端是怎么组织的。B站为了照顾不同网络状况的用户,视频存储方式做了大量优化,但也正因为这些优化,它和普通网站上那种“点开链接直接是一个MP4文件”的情况完全不同。

1.1 音画分离机制

现在的B站视频,尤其是高清视频,默认采用DASH技术。简单说,就是把视频画面和音频分成两个独立文件存储和传输。播放的时候,页面播放器同时下载这两个文件,再用浏览器能力把它们实时拼在一起播放。

这个设计在流媒体播放上很高效:网络不好时可以只降低画面清晰度,音频保持流畅;拖动进度条时视频帧能快速定位,音频也能同步跟上。但对下载的人来说这就有点麻烦了:如果你只拿到视频流,那下载来的文件就是没声音的;只拿到音频流,就得到一堆音频。这两者必须凑齐,再用工具合并成一个完整的视频文件。

我刚开始尝试下载的时候,就曾经下载了一大堆只有画面没有声音的视频,那种感觉就像炒菜忘放盐,差那么一点但完全没法用。

1.2 分段切片与防盗链

B站视频的另一个显著特点是分段。部分视频会被切成多个小块,尤其是高清或超长视频。文件被切成几十个小片段,播放时依次加载。这和早期的FLV分段播放类似。直接下载这种视频,你会得到一堆编号奇怪的碎片文件,少了任何一个都拼不出完整画面。

同时,B站针对视频文件有防盗链机制。最简单直接的体现就是:把视频链接复制到新标签页打开,往往会提示403 Forbidden。这是因为服务器检查HTTP请求头中的Referer信息,发现这个请求不是从B站页面发出的,就判定为异常访问并拒绝返回数据。下载工具要是没处理好这一层,请求就会被拒绝。

1.3 画质权限与登录态

B站的不同画质是有权限差异的。普通1080P以下一般无需登录也能看,但1080P高码率、120帧、HDR这些更高画质,通常需要登录账号,甚至可能需要对应会员权限。

很多下载工具默认以匿名身份访问视频,自然只能拿到720P甚至更低的清晰度。所以如果你希望下载到1080P以上的最佳效果,就需要把浏览器里的登录态授权给下载工具,让服务器认为“这是一个合法用户的高清请求”,而不是游客访问。

理解这三层机制之后,再去看各种下载方案,思路就会清楚很多:所谓“下载视频”,本质上就是伪装成合法播放请求,把视频流和音频流分别拉下来,再合并成普通视频文件。

2. 主力方案:yt-dlp命令行工具

试过很多下载工具之后,真正让我稳定的还是yt-dlp这个命令行工具。它对B站的支持非常完善,更新频率也高,能应对协议变化。虽然命令行表面看起来有点吓人,但实际用起来熟练之后效率极高,尤其批量处理多集视频时,优势非常明显。

目前网上很多老的教程还在推荐其他工具,但实测下来,遇到B站调整协议之后还能及时适配的,yt-dlp算是最省心的。

2.1 安装与环境准备

yt-dlp本身是Python程序,但日常使用不需要自己写Python代码。最常规的安装方式是使用pip:

pip install yt-dlp

如果电脑同时装了多个Python版本,可能需要用更精确的命令:

python3 -m pip install yt-dlp

安装完成后,还需要单独安装一个辅助工具:FFmpeg。yt-dlp负责下载视频流和音频流,但把这两条流合并成最终文件的工作由FFmpeg完成。没有FFmpeg,下载到的就是分离的音视频文件,依然没法正常观看。

FFmpeg的安装方式因系统而异。下载对应系统的版本后,把bin目录路径添加到系统环境变量PATH里即可。配置好之后在命令行输入ffmpeg -version,看到版本输出,就说明环境OK了。

注意:FFmpeg是一个基础底层工具,它本身不涉及任何破解操作,是多媒体处理领域最常见的开源软件。

2.2 单集视频下载:最常用的组合命令

环境准备好之后,下载单集视频的基本命令长这样:

yt-dlp -f "bv*+ba/b" --merge-output-format mp4 "视频地址"

我来逐段拆解这条命令:

  • -f "bv*+ba/b"是格式选择参数。bv*表示最佳视频流,ba表示最佳音频流,两者用加号组合,意思就是“分别取画质最好的视频流和音质最好的音频流,然后合并”。/b是回退选项:如果找不到分离的最佳流,就退回单一文件格式。这个参数在B站场景下非常关键,因为直接取默认格式很可能只下到纯视频流。
  • --merge-output-format mp4指定合并后的容器格式。B站现在很多视频流本身是MP4或分段切片,合并时强制输出为MP4能避免封装格式不兼容的播放问题。
  • 最后的“视频地址”就是B站视频页面的完整URL。

如果是下载整个分P视频页面里的某一P,也可以用--playlist-items 3这样的参数来指定要第几个分P,而不是直接一个个复制地址。

2.3 下载整个合集:批量操作

CrashCourse系列的视频在B站上大多是以合集或分P形式上传的,比如几十集内容放在一个投稿里。一个个复制地址下载显然不现实,因此批量下载是刚需。

批量下载合集的基本命令是:

yt-dlp -f "bv*+ba/b" --merge-output-format mp4 --playlist-start 1 --playlist-end 50 "合集地址"
  • --playlist-start 1表示从第1个分P开始。
  • --playlist-end 50表示下载前50个分P。

如果不加这两个参数,yt-dlp会尝试下载整个合集的所有视频。这在视频数量很大时容易中途出错或超时。

注意点:B站页面上“分P”的概念,在yt-dlp的语境里会被识别为playlist的一部分。所以给合集地址加上这些参数,是为了精确控制下载范围,尤其是当某个合集有上百集时,分批下载比一次全量下完更稳妥,方便随时断点续传。

2.4 字幕下载

CrashCourse这种教育类视频,字幕是刚需。很多搬运版本自带中文或英文字幕,下载时同步抓取能极大方便做笔记。

如果需要下载字幕,在命令后面追加:

yt-dlp --write-subs --sub-langs "zh-Hans,zh-CN,en" --sub-format srt "视频地址"
  • --write-subs开启字幕下载。
  • --sub-langs指定字幕语言。中文简体和英文是主要常见语言选项。
  • --sub-format srt指定字幕封装格式。SRT是最通用、任何播放器和剪辑软件都能识别的字幕格式。

有时候在线字幕是B站弹幕转换生成的ASS特效字幕,可能需要搭配--write-auto-subs这类参数。默认情况下先把常规字幕下好,实际使用中覆盖90%的需求。

2.5 用浏览器登录态换更高画质

如果想要1080P以上画质,需要登录Cookie。一般不建议直接把Cookie字符串复制进命令,因为很麻烦且容易过期。yt-dlp提供了更优雅的方式:

yt-dlp --cookies-from-browser chrome "视频地址"

这个命令会让yt-dlp直接读取你用Chrome登录B站时保存的登录态,以你账号的身份发起下载请求。自然就有权限获取你账号等级对应的画质上限。

注意:使用--cookies-from-browser时要关闭对应浏览器,否则部分浏览器会锁定Cookie数据库导致读取失败。

使用浏览器登录态登录时,要注意隐私风险:千万不要把带Cookie的命令分享给别人,因为那相当于别人能用你的身份信息。下载完成后及时清理命令历史是个好习惯。

2.6 实测效果

就我自己下载的经验来看,B站上常规视频画质以1080P为主,使用-f "bv*+ab/b"模式,一般能取到高质量的MP4视频流和音频流。一个20分钟左右的视频,下载过程大致几十秒到几分钟不等,合并时间也很快。

用yt-dlp批量下载整个系列视频时,感受尤其明显:设定好范围后挂机几十分钟,回来之后整个系列都已经按分P顺序编号下载好了。配合ffmpeg自动合并,文件名是B站自动编号的001、002这种格式,排序看视频时不会乱。

不过有一点要提醒:yt-dlp的合并过程依赖FFmpeg的完整安装,如果安装得不全,合并阶段可能会报错,后面章节里我会单独说说这类问题怎么排查。

3. 备选方案:浏览器开发者工具与插件

命令行工具虽然强大,但有些朋友还是觉得不够直观,或者不想装Python环境。那我自己平时备用的方案是用浏览器开发者工具找真实视频地址,再配合浏览器插件下载。

3.1 从开发者工具找真实视频流地址

这个方案的核心思路很朴素:视频在网页里播放,本质上是播放器发出请求获取文件,那我们就在浏览器后台看它向哪个地址要了文件。

步骤很简单:

  1. 打开视频页面,按F12打开开发者工具。
  2. 切到Network(网络)标签页,保证页面保持打开。
  3. 点击播放视频,让播放器动起来。
  4. 在Network面板的筛选栏输入“media”或者手动过滤媒体类型(如video/mp4)。
  5. 找到类型是media的请求,通常会有多个,名称类似302开头或者一串数字ID。

这些请求背后,就是播放器在向服务器要视频流或音频流数据。每个请求点开之后,在Headers区域能看到完整的Request URL。

拿到URL之后复制到新标签页打开,有时候能直接播放或自动下载。如果这个请求是视频流,直接在地址栏回车有时能触发浏览器视频播放。但大多数情况下,直接打开会失败,因为服务器会校验Referer头。这时候就需要让下载工具带上Referer: https://www.bilibili.com这个请求头再请求。

3.2 浏览器插件的便捷与局限

浏览器插件是另一个常用方案。这类插件能自动嗅探网页里的视频源,并在页面角落弹出下载按钮。安装好这类插件后,观看视频时如果监听到媒体请求,就能直接把素材保存下来。

它们的优点是非常直观,不需要命令行,适合零基础用户。但局限也很明显:

  • 对B站保护机制支持不稳定,面对防盗链时经常拿到的仍是音画分离的碎片文件。
  • 无法选择画质和字幕,或者说选择能力弱于命令行。
  • 无法批量下载分P视频,需要手动一集一集切页面。
  • 浏览器插件本身可能含不良代码,选择时要格外谨慎,尽量用知名度高、用户多、代码开源审核的同类扩展。

从我自己的经验来看,这类插件适合“临时下一两集看看”,但如果想系统性地下载一整个系列,还是命令行工具更可靠。

4. 移动端最省事方案:官方App离线缓存

如果你主要是想在路上用手机看,那绕了半天的下载工具可能都不需要。B站App自己就带了离线缓存功能,而且是官方提供的合规能力。

4.1 官方缓存的使用方法

操作非常简单:

  1. 打开B站App,找到你想缓存的视频。
  2. 进到播放页,点击右下角的“缓存”或“下载”按钮。
  3. 选择清晰度(通常是1080P或720P可选)。
  4. 等待下载完成。

下载好的视频在App的“离线缓存”列表里能找到,可以离线播放。

4.2 官方缓存的限制

但官方缓存有个关键限制:缓存的视频文件不是通用的MP4文件,而是经过特殊加密和分片处理的数据包。这些数据只能在B站App内部解密播放,无法从缓存目录里直接拷贝出来当成普通视频使用。哪怕你把一堆缓存文件从手机存储里复制出来,拿到电脑上,也没法播放。

所以这个方案适合的仅仅是自己手机上离线看,无法满足“导出到电脑整理笔记”或“长期存档”的需求。如果你需要的只是移动端临时观看,那确实是最省事的方案,不用装任何工具,也不用理解什么音视频分离、防盗链。

作为补充,手机上如果确实想把B站视频转成普通文件,也可以试试手机浏览器访问B站网页版,然后用第三方的移动端下载工具软件。但各手机系统对第三方下载的权限限制不同,稳定性也不如电脑方案,个人不推荐把它作为主要选择。

5. 常见问题与排查技巧实录

下载过程中,我整理了几类高频出现的问题,按症状、原因、处理方式做了一个对照表,基本覆盖了常见情况。

问题现象可能原因处理方式
下载报错HTTP Error 403防盗链检查未通过,缺少Referer或者Cookie。添加--referer或在命令末尾追加--cookies-from-browser参数;只用浏览器插件时需手动给下载工具添加Referer头信息。
下载成功但视频没有声音只下载了视频流,未下载音频流。使用-f "bv*+ba/b"强制同时抓取最佳音视频流,并在最后追加--merge-output-format mp4合并。
下载到一半断开或报错Unable to extractB站协议变动,官方调整访问方式导致工具解析失败。升级yt-dlp到最新版:pip install -U yt-dlp;若仍未解决,检查所选视频是否有特殊限制或权限要求。
合并阶段报错ffmpeg not foundFFmpeg未安装或路径未配置到系统环境变量。重新安装FFmpeg,并把bin目录加到PATH;命令行输入ffmpeg -version确认能正常调用。
合集下载顺序混乱没有使用--playlist-start和--playlist-end限定时,工具可能按页面顺序或默认逻辑处理。用这两个参数锁定起始和结束分P编号,或按序号逐条指定分P下载。
下载后全是短小碎片文件B站部分视频采用DASH分段存储,网址指向的是切片分片。使用yt-dlp自动组装分片并合并,不要手动逐个下载分片文件。
字幕文件无法下载字幕语言代码写错,或该视频本身未挂字幕。先用--list-subs查看可用字幕语言列表,再按实际代码填入--sub-langs。
想要更高清晰度但只有低画质未带登录态,下载工具以游客身份请求。使用--cookies-from-browser chrome注入浏览器登录状态后再下载。

5.1 处理403防盗链问题的细节

403问题应该是频率最高的。很多朋友把视频流地址复制下来后,用浏览器直接下载,得到403错误页面,就觉得是地址失效。其实不是失效了,而是请求头缺少Referer: https://www.bilibili.com/这个信息。

在yt-dlp中不需要手动加,它会自动处理。但如果你是在用浏览器插件或手工下载时遇到了403,可以在请求头里补上B站域名,同时补一个正常的User-Agent,大概率就能顺利拿回数据。

5.2 音视频合并的最佳实践

下载完成后如果要手动合并,常用工具就是FFmpeg,命令行如下(不用yt-dlp自动合并时参考):

ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4

意思是把视频流和音频流直接复制到同一个MP4容器里,不重新编码,速度极快,也不会损失画质。

实操中要注意-c copy这个参数,它实现的是“流复制”而不是“转码”。如果你不加这个参数,FFmpeg默认会尝试重新编码,不仅慢,还可能因为编码器缺失导致失败。我一直都用流复制的方式,几十秒就能完成一集视频的合并。

5.3 合集批量下载时命名与排序建议

下载大量分P视频后,文件命名会直接决定观看体验。如果文件名不按序号排序,播放器读取顺序会很乱。所以一般建议把下载好的文件重命名为01_标题、02_标题这样的格式,或者让yt-dlp直接按分P序生成文件名。

yt-dlp本身有一个好处:下载分P视频时,默认输出文件名往往带有序号,排序整体上还是可控的。如果发现个别情况下名称不统一,可以稍作整理。CrashCourse系列这类教育内容通常集数固定,建议下载时一次性把所有分P选好,分批命名,最后在文件管理器里按名称排序就不会乱。

5.4 下载中断后的续传

下载到一半网络断了,重新开始往往又要从头来过。yt-dlp默认是支持断点续传的,重新运行同样的命令时,已经下载完成的部分会继续,而不是全部重新下载。这在大批量下载时非常实用。

不过要注意:合并阶段发生中断时,除非字幕等附属文件也已下载完成,否则重跑时可能仍会尝试重新下载。建议中断后不要惊慌,直接在相同命令后追加--download-archive archive.txt参数,它会记录哪些视频已经下载完成,下次运行时自动跳过已完成项,只补下缺失的。

6. 一点额外的个人建议

整个流程跑通以后,我个人还是比较依赖yt-dlp这套方案,基本已经替代了所有图形化下载工具。倒不是说其他工具不好,而是命令行方式可控性最强,画质选择、字幕抓取、批量组合、断点续传都很顺手,定期pip install -U yt-dlp保持更新之后几乎没有遇到什么难题。

如果你平时主要用手机看视频,那把B站App的离线缓存当作第一选择就好,不折腾、也稳定。但假如你确实需要把视频整理成自己的知识管理素材、做摘录笔记,或者想一次性保存整个系列节目,那在电脑上装一套yt-dlp加FFmpeg,一次性把工具配好,之后所有下载需求就是几行命令的事。

最后说一句:下载来的视频,给自己离线学习和做笔记用就很合适,不要二次上传或大范围传播。CrashCourse这类内容本身是他人辛苦制作的成果,B站搬运也带着字幕组和相关内容创作者的付出,尊重版权应该是每个学习者最基本的底线。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询