1. 为什么我要自己动手做视频下载这件事
先说结论:B站和抖音的视频下载,看起来是个小需求,但真到用的时候,你会发现市面上的工具要么广告满天飞,要么下着下着就失效,要么偷偷给你塞一堆捆绑软件。我自己做内容归档两年多,前前后后试过不下二十种方案,最后沉淀出一套相对稳定的做法,今天把它完整拆开讲清楚。
这篇文章适合三类人:一是做内容运营、需要批量收集素材的同行;二是做学术研究、需要保存公开视频做语料分析的朋友;三是单纯想把自己喜欢的视频存到本地、防止哪天原链接失效的普通用户。不管你是零基础还是有点技术底子,我都会把原理、工具选型、实操步骤和踩过的坑讲透。
需要提前说明的是,我讨论的所有场景都基于公开可访问的视频内容,用于个人学习、研究和备份。任何涉及付费内容、会员专享内容的绕过行为,都不在本文讨论范围内,也不建议大家去做。技术是中性的,但使用边界要自己守住。
核心关键词先摆出来:B站视频下载、抖音视频下载、视频下载工具、去水印、批量下载、解析工具。这几个词基本覆盖了大家搜索时的真实意图。下面我按“整体思路—核心细节—实操过程—问题排查”的顺序展开,每一块都会给出可直接复现的方案。
2. 整体方案设计与工具选型思路
2.1 先搞清楚:视频下载到底难在哪
很多人以为下载视频就是“找到文件地址,右键保存”,实际远没这么简单。以B站为例,一个视频的播放链路大致是这样的:网页播放器向服务器请求一个播放清单文件,这个清单里记录了视频被切成多少个小片段、每个片段的地址和音视频轨道的分离信息。也就是说,你看到的“一个视频”,在服务器端其实是音轨和视频轨分开存储、分片传输的。
抖音的逻辑又不一样。抖音的视频通常是整段MP4,但URL里带了时效性签名参数,过期就失效,而且默认带水印。所以抖音下载的核心是“拿到无水印的原始地址”,B站下载的核心是“把分离的音视频轨合并”。
理解了这两点,你就明白为什么很多“一键下载”工具会失效——它们依赖的接口变了,或者签名算法更新了,工具没跟上就废了。这也是我倾向于用成熟开源工具+自己写少量脚本的原因:可控、可维护、不依赖某个随时可能跑路的网站。
2.2 工具选型的三个硬标准
我选工具只看三条:开源可查、命令行优先、更新活跃。理由很直接:
- 开源可查,意味着没有后门,不会偷偷上传你的数据;
- 命令行优先,意味着可以脚本化、批量处理,效率比点鼠标高一个数量级;
- 更新活跃,意味着接口变了有人修,不会用两个月就成废铁。
基于这三条,我最终的主力工具是yt-dlp(B站、YouTube等通用)和you-get(备用),抖音则用yt-dlp 配合自定义请求头或专门的解析脚本。下面这张表是我实测过的几个方案对比,你可以按需选:
| 工具 | 支持平台 | 批量能力 | 去水印 | 上手难度 | 维护状态 |
|---|---|---|---|---|---|
| yt-dlp | B站/抖音/多平台 | 强 | 抖音需配置 | 中 | 极活跃 |
| you-get | B站/多平台 | 中 | 不支持 | 低 | 活跃 |
| 浏览器插件类 | 单平台 | 弱 | 部分支持 | 极低 | 不稳定 |
| 在线解析网站 | 单平台 | 弱 | 部分支持 | 极低 | 随时失效 |
提示:在线解析网站我基本不用,一是广告多,二是你不知道它把你的链接拿去做了什么,三是今天能用明天可能就没了。个人备份场景,本地工具永远是最稳的。
2.3 为什么我不推荐“全家桶式”下载软件
市面上有些打包好的下载软件,界面花哨,号称支持几百个平台。我早期也用过,后来全卸载了。原因有三个:第一,这类软件往往捆绑安装,装一个来一堆;第二,它们的核心其实也是调用开源工具,只是套了个壳,但壳里可能加了广告SDK;第三,出问题时你没法排查,只能等作者更新。
自己用命令行工具,前期花半小时配置,后面就是复制粘贴的事,长期看反而省时间。这个账我算过:用图形软件每次下载要经历“打开软件—粘贴链接—选清晰度—等广告—点下载”五步,命令行一条命令搞定,批量一百个视频的差距是几小时。
3. 核心细节解析与实操要点
3.1 B站下载:音视频分离与合并的关键
B站下载最容易踩的坑,就是下下来只有画面没声音,或者只有声音没画面。这是因为B站的高清视频(1080P及以上)普遍采用DASH 格式,音轨和视频轨是分开的两个流。你需要工具同时下载两条流,再用ffmpeg合并。
yt-dlp 默认就会处理这个合并,但前提是你系统里装了 ffmpeg。所以第一步不是装 yt-dlp,而是先装 ffmpeg。这一点很多人忽略,结果下出来的文件是分离的,还以为是工具坏了。
关于清晰度选择,B站不同清晰度对应的编码格式不一样:
| 清晰度 | 编码 | 是否需要登录 | 备注 |
|---|---|---|---|
| 360P/480P | AVC | 否 | 直接可下 |
| 720P | AVC/HEVC | 部分需要 | 建议登录 |
| 1080P | AVC/HEVC | 通常需要 | 登录后可用 |
| 1080P+ / 4K | HEVC/AV1 | 需要 | 部分需大会员 |
注意:我这里说的“登录”是指用你自己正常注册的账号,通过工具提供的 cookie 导入功能,让工具以你的身份请求公开内容。这属于正常使用范畴,但请务必遵守平台规则,不要用于批量抓取或商业用途。
实操上,我一般用-f参数指定格式,比如-f "bv*+ba/b"表示“最佳视频轨+最佳音频轨,如果没有就退而求其次选合并流”。这个参数写法是 yt-dlp 的通用语法,记住一次能用一辈子。
3.2 抖音下载:去水印的核心逻辑
抖音的去水印,本质是找到不带水印的原始视频地址。抖音在生成分享链接时,会同时存在带水印和不带水印两个版本,普通用户分享出来的是带水印的,但通过解析分享链接里的视频ID,可以请求到无水印的播放地址。
具体做法是:把抖音分享出来的短链接(形如https://v.douyin.com/xxxx/)先做一次重定向跟随,拿到真实的视频ID,再用这个ID去请求播放接口。yt-dlp 对抖音的支持时好时坏,因为抖音的接口变动比较频繁。我的经验是,保持 yt-dlp 更新到最新版,大部分时候能直接用;如果不行,就退回到手动解析的方式。
手动解析的步骤我整理成下面这样,方便你对照操作:
- 复制抖音分享链接,在浏览器打开,观察地址栏跳转后的URL;
- 从URL中提取
video/后面的数字ID,这就是视频的唯一标识; - 用这个ID拼接播放接口地址(具体接口会变,这里不写死,思路是找到返回JSON的接口);
- 从返回的JSON里找到
play_addr字段,里面的URL就是无水印地址; - 用下载工具把这个URL存下来。
这个过程听起来绕,但熟练之后两分钟搞定。如果你嫌麻烦,直接用 yt-dlp 加--no-check-certificate和自定义 User-Agent,成功率也不低。
3.3 批量下载:把重复劳动交给脚本
单个视频下载谁都会,真正体现效率的是批量。B站批量下载的入口通常是收藏夹、UP主主页、合集。yt-dlp 支持直接传入这些页面的URL,它会自动解析出里面所有视频并逐个下载。
批量下载有两个参数必须掌握:-o控制输出文件名模板,--download-archive记录已下载的视频,避免重复。我常用的模板是:
yt-dlp -o "%(uploader)s/%(title)s.%(ext)s" \ --download-archive downloaded.txt \ --sleep-interval 3 \ "播放列表URL"这里的--sleep-interval 3是每次下载间隔3秒,目的是降低请求频率,避免给服务器造成压力,也降低被限流的概率。这一点很重要,批量抓取时如果不加间隔,很容易触发风控,轻则限速,重则临时封禁。做技术要有分寸,别把人家服务器当自己家硬盘。
抖音批量下载相对麻烦,因为抖音没有公开的“合集”概念(至少不像B站那么规整)。我的做法是:先用工具把某个账号的公开视频列表抓下来(这一步涉及页面解析),拿到视频ID列表后,再逐个解析下载。这个过程我一般控制在个人备份的合理范围内,不会大规模抓取。
4. 完整实操过程与核心环节实现
4.1 环境准备:三件套装好就成功一半
我的环境是 Windows + WSL(Linux子系统),但下面的步骤在纯 Windows、macOS、Linux 上都通用,只是安装命令略有差异。核心三件套是:Python、ffmpeg、yt-dlp。
先装 Python,建议 3.9 以上版本。Windows 用户去官网下安装包,记得勾选“Add to PATH”。macOS 用户用brew install python。Linux 用户基本自带。
然后装 ffmpeg,这是合并音视频的关键。Windows 用户推荐用winget install ffmpeg或者去官网下静态编译版,解压后把bin目录加到环境变量。macOS 用brew install ffmpeg。Linux 用apt install ffmpeg或对应包管理器。
最后装 yt-dlp,最省事的方式是用 pip:
pip install -U yt-dlp装完验证一下:
yt-dlp --version ffmpeg -version两条命令都能输出版本号,环境就算齐了。这里有个小坑:如果你同时装了多个 Python 版本,pip 可能装到了不是你预期的那个环境里,导致命令行找不到 yt-dlp。解决办法是用python -m yt-dlp代替yt-dlp,或者用pip show -f yt-dlp看装到哪了。
4.2 B站单个视频下载:一条命令的事
假设你要下载一个B站视频,地址是https://www.bilibili.com/video/BVxxxxxxxxx。最基础的命令是:
yt-dlp "https://www.bilibili.com/video/BVxxxxxxxxx"它会自动选择最佳画质并合并。如果你想指定 1080P,可以先用-F列出所有可用格式:
yt-dlp -F "视频URL"输出会是一个表格,每行前面有个格式编号。找到你想要的视频轨和音频轨编号,比如视频是137,音频是140,就用:
yt-dlp -f "137+140" "视频URL"合并后的文件默认是.mp4或.mkv。如果你想要 mp4,加--merge-output-format mp4。
关于登录:B站 1080P 以上通常需要登录。yt-dlp 支持从浏览器读取 cookie,命令是--cookies-from-browser chrome(把 chrome 换成你用的浏览器)。这个功能很方便,但要注意,它读取的是你本地的登录状态,请确保你的账号使用符合平台规则。
4.3 抖音视频下载:处理短链接和请求头
抖音下载我通常分两步。第一步,把短链接展开。可以用 curl 看重定向:
curl -sIL "https://v.douyin.com/xxxx/" | grep -i location拿到真实URL后,提取视频ID。第二步,用 yt-dlp 下载,但抖音对请求头比较敏感,建议加上 User-Agent:
yt-dlp --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..." "真实URL"如果 yt-dlp 直接支持,它会自动处理去水印。如果不支持,就需要手动解析接口。手动解析我用 Python 写个小脚本,核心逻辑是:请求分享页HTML,用正则提取videoId,再请求播放接口拿play_addr。这个脚本不长,二十行左右,但接口地址会变,所以我不在这里写死,思路给你,你自己按当前接口调整。
提示:抖音的接口变动非常频繁,今天能用的方法下个月可能就失效。所以我的建议是,优先用 yt-dlp 这类活跃维护的工具,让专业的人去跟进接口变化,你只管用。
4.4 批量下载B站收藏夹:一次搞定整个列表
这是我最常用的场景。假设你有一个收藏夹,地址是https://space.bilibili.com/xxx/favlist?fid=xxx。直接把这个URL丢给 yt-dlp:
yt-dlp -o "%(uploader)s/%(playlist_index)02d-%(title)s.%(ext)s" \ --download-archive archive.txt \ --sleep-interval 5 \ --merge-output-format mp4 \ "收藏夹URL"几个参数解释一下:%(playlist_index)02d是两位数的序号,方便排序;--download-archive记录已下载的ID,下次再跑同一个列表,已下载的会自动跳过;--sleep-interval 5是每个视频间隔5秒,稳一点。
实测下来,一个两百个视频的收藏夹,跑一晚上基本能下完。中途如果断了,重新跑一遍命令,它会从断点继续,不会重复下载。这个断点续传能力是 yt-dlp 自带的,非常省心。
4.5 抖音批量下载的折中方案
抖音批量我没有找到特别优雅的官方支持方式,我的折中方案是:半自动。先用工具把目标账号的视频列表导出成文本(每行一个视频ID或URL),然后写个循环脚本逐个调用 yt-dlp。
while read url; do yt-dlp --user-agent "..." -o "%(title)s.%(ext)s" "$url" sleep 5 done < douyin_list.txt这个方案的好处是可控,每个视频之间的间隔你能自己调,出问题也能定位到具体是哪个视频。坏处是需要你先准备好列表。列表怎么来?如果是自己的账号,可以从创作服务平台导出;如果是公开账号,那就得靠页面解析,这一步我建议量力而行,控制在合理范围内。
5. 常见问题与排查技巧实录
5.1 下载下来没声音/没画面怎么办
这是最高频的问题,九成是因为 ffmpeg 没装好或者没在 PATH 里。排查步骤:先运行ffmpeg -version,如果报“command not found”,那就是没装或没配好环境变量。装好之后,重新下载,yt-dlp 会自动调用 ffmpeg 合并。
如果 ffmpeg 没问题还是没声音,检查一下是不是用了-f参数只选了视频轨。用-F看看格式列表,确认你选的格式编号里,视频轨和音频轨是分开的两个,然后用+连接。
5.2 提示“Unable to extract”或“Unsupported URL”
这通常意味着工具版本太旧,跟不上平台接口变化。第一反应应该是更新:
pip install -U yt-dlp如果更新后还不行,可能是该视频有特殊限制(比如付费、地区限制),这种情况我建议直接放弃,不要花时间去绕。技术能力应该用在正道上。
5.3 下载速度慢或被限流
批量下载时速度慢,多半是触发了平台的频率限制。解决办法就是加--sleep-interval,把间隔调大,比如从3秒调到10秒。另外可以加--limit-rate限制下载速度,比如--limit-rate 2M,避免占满带宽引起注意。
还有一个技巧是错峰下载,比如凌晨跑批量任务,这时候服务器压力小,速度也快。我自己习惯是晚上睡觉前挂上,第二天早上收菜。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 无声音 | ffmpeg未安装 | 安装ffmpeg并配置PATH |
| 无画面 | 只选了音频轨 | 用-F确认格式,选视频+音频 |
| 提示不支持URL | 工具版本旧 | pip install -U yt-dlp |
| 下载中断 | 网络波动 | 重新运行,自动断点续传 |
| 速度极慢 | 触发限流 | 加大sleep-interval,错峰下载 |
| 文件名乱码 | 编码问题 | 加--restrict-filenames或指定-o模板 |
| 抖音去水印失败 | 接口变动 | 更新工具,或手动解析 |
5.5 几个我踩过的坑
第一个坑:早期我用某在线解析网站下B站视频,下下来的文件是.flv格式,很多播放器不支持。后来才知道那是老的低清格式。现在用 yt-dlp 默认就是 mp4,省心多了。
第二个坑:有次批量下载一个UP主的视频,没加间隔,结果下了三十个之后全部失败,等了两小时才恢复。从那以后我批量必加--sleep-interval,再也没出过问题。
第三个坑:文件名里的特殊字符导致保存失败。Windows 对文件名有限制,冒号、问号这些不能出现。解决办法是用--restrict-filenames参数,它会自动把特殊字符替换掉。
第四个坑:cookie 过期。用浏览器 cookie 下载B站高清视频,过一段时间 cookie 失效,下载就变成低清或者失败。解决办法是重新从浏览器读取一次,或者用--cookies指定一个手动导出的 cookie 文件,定期更新。
6. 关于稳定性和长期可用的一点个人经验
工具这东西,没有一劳永逸的。平台在变,工具也在变,今天好用的方案,半年后可能需要调整。我的应对策略是:保持工具更新,保持方案简单,保持使用克制。
保持工具更新,就是定期跑一下pip install -U yt-dlp,让它始终是最新版。保持方案简单,就是能用一条命令解决的事,绝不搞复杂脚本,减少出问题的环节。保持使用克制,就是批量下载时加间隔、控数量,不贪多,细水长流。
另外我建议你建一个自己的“下载归档”目录结构,按平台、按UP主、按日期分类,配合--download-archive记录,这样时间长了也不会乱。我自己的归档目录跑了两年,几千个视频,找起来依然很快,靠的就是一开始把结构定好。
最后分享一个小技巧:如果你经常下载同一批UP主的视频,可以把常用的命令写成 shell 脚本或 bat 批处理,双击就能跑。比如我有个download_bili.sh,里面就一行 yt-dlp 命令加参数,每次只需要改一下URL。这种小自动化,日积月累能省下大量时间。
技术服务于需求,别为了折腾而折腾。找到一套自己顺手的方案,稳定用下去,比天天追新工具强得多。