B站抖音视频下载全攻略:yt-dlp与ffmpeg实战指南
2026/9/24 6:36:30 网站建设 项目流程

1. 为什么我要自己动手做视频下载这件事

先说结论:B站和抖音的视频下载,看起来是个小需求,但真到用的时候,你会发现市面上的工具要么广告满天飞,要么下着下着就失效,要么偷偷给你塞一堆捆绑软件。我自己做内容归档两年多,前前后后试过不下二十种方案,最后沉淀出一套相对稳定的做法,今天把它完整拆开讲清楚。

这篇文章适合三类人:一是做内容运营、需要批量收集素材的同行;二是做学术研究、需要保存公开视频做语料分析的朋友;三是单纯想把自己喜欢的视频存到本地、防止哪天原链接失效的普通用户。不管你是零基础还是有点技术底子,我都会把原理、工具选型、实操步骤和踩过的坑讲透。

需要提前说明的是,我讨论的所有场景都基于公开可访问的视频内容,用于个人学习、研究和备份。任何涉及付费内容、会员专享内容的绕过行为,都不在本文讨论范围内,也不建议大家去做。技术是中性的,但使用边界要自己守住。

核心关键词先摆出来:B站视频下载、抖音视频下载、视频下载工具、去水印、批量下载、解析工具。这几个词基本覆盖了大家搜索时的真实意图。下面我按“整体思路—核心细节—实操过程—问题排查”的顺序展开,每一块都会给出可直接复现的方案。

2. 整体方案设计与工具选型思路

2.1 先搞清楚:视频下载到底难在哪

很多人以为下载视频就是“找到文件地址,右键保存”,实际远没这么简单。以B站为例,一个视频的播放链路大致是这样的:网页播放器向服务器请求一个播放清单文件,这个清单里记录了视频被切成多少个小片段、每个片段的地址和音视频轨道的分离信息。也就是说,你看到的“一个视频”,在服务器端其实是音轨和视频轨分开存储、分片传输的。

抖音的逻辑又不一样。抖音的视频通常是整段MP4,但URL里带了时效性签名参数,过期就失效,而且默认带水印。所以抖音下载的核心是“拿到无水印的原始地址”,B站下载的核心是“把分离的音视频轨合并”。

理解了这两点,你就明白为什么很多“一键下载”工具会失效——它们依赖的接口变了,或者签名算法更新了,工具没跟上就废了。这也是我倾向于用成熟开源工具+自己写少量脚本的原因:可控、可维护、不依赖某个随时可能跑路的网站。

2.2 工具选型的三个硬标准

我选工具只看三条:开源可查、命令行优先、更新活跃。理由很直接:

  • 开源可查,意味着没有后门,不会偷偷上传你的数据;
  • 命令行优先,意味着可以脚本化、批量处理,效率比点鼠标高一个数量级;
  • 更新活跃,意味着接口变了有人修,不会用两个月就成废铁。

基于这三条,我最终的主力工具是yt-dlp(B站、YouTube等通用)和you-get(备用),抖音则用yt-dlp 配合自定义请求头或专门的解析脚本。下面这张表是我实测过的几个方案对比,你可以按需选:

工具支持平台批量能力去水印上手难度维护状态
yt-dlpB站/抖音/多平台抖音需配置极活跃
you-getB站/多平台不支持活跃
浏览器插件类单平台部分支持极低不稳定
在线解析网站单平台部分支持极低随时失效

提示:在线解析网站我基本不用,一是广告多,二是你不知道它把你的链接拿去做了什么,三是今天能用明天可能就没了。个人备份场景,本地工具永远是最稳的。

2.3 为什么我不推荐“全家桶式”下载软件

市面上有些打包好的下载软件,界面花哨,号称支持几百个平台。我早期也用过,后来全卸载了。原因有三个:第一,这类软件往往捆绑安装,装一个来一堆;第二,它们的核心其实也是调用开源工具,只是套了个壳,但壳里可能加了广告SDK;第三,出问题时你没法排查,只能等作者更新。

自己用命令行工具,前期花半小时配置,后面就是复制粘贴的事,长期看反而省时间。这个账我算过:用图形软件每次下载要经历“打开软件—粘贴链接—选清晰度—等广告—点下载”五步,命令行一条命令搞定,批量一百个视频的差距是几小时。

3. 核心细节解析与实操要点

3.1 B站下载:音视频分离与合并的关键

B站下载最容易踩的坑,就是下下来只有画面没声音,或者只有声音没画面。这是因为B站的高清视频(1080P及以上)普遍采用DASH 格式,音轨和视频轨是分开的两个流。你需要工具同时下载两条流,再用ffmpeg合并。

yt-dlp 默认就会处理这个合并,但前提是你系统里装了 ffmpeg。所以第一步不是装 yt-dlp,而是先装 ffmpeg。这一点很多人忽略,结果下出来的文件是分离的,还以为是工具坏了。

关于清晰度选择,B站不同清晰度对应的编码格式不一样:

清晰度编码是否需要登录备注
360P/480PAVC直接可下
720PAVC/HEVC部分需要建议登录
1080PAVC/HEVC通常需要登录后可用
1080P+ / 4KHEVC/AV1需要部分需大会员

注意:我这里说的“登录”是指用你自己正常注册的账号,通过工具提供的 cookie 导入功能,让工具以你的身份请求公开内容。这属于正常使用范畴,但请务必遵守平台规则,不要用于批量抓取或商业用途。

实操上,我一般用-f参数指定格式,比如-f "bv*+ba/b"表示“最佳视频轨+最佳音频轨,如果没有就退而求其次选合并流”。这个参数写法是 yt-dlp 的通用语法,记住一次能用一辈子。

3.2 抖音下载:去水印的核心逻辑

抖音的去水印,本质是找到不带水印的原始视频地址。抖音在生成分享链接时,会同时存在带水印和不带水印两个版本,普通用户分享出来的是带水印的,但通过解析分享链接里的视频ID,可以请求到无水印的播放地址。

具体做法是:把抖音分享出来的短链接(形如https://v.douyin.com/xxxx/)先做一次重定向跟随,拿到真实的视频ID,再用这个ID去请求播放接口。yt-dlp 对抖音的支持时好时坏,因为抖音的接口变动比较频繁。我的经验是,保持 yt-dlp 更新到最新版,大部分时候能直接用;如果不行,就退回到手动解析的方式。

手动解析的步骤我整理成下面这样,方便你对照操作:

  1. 复制抖音分享链接,在浏览器打开,观察地址栏跳转后的URL;
  2. 从URL中提取video/后面的数字ID,这就是视频的唯一标识;
  3. 用这个ID拼接播放接口地址(具体接口会变,这里不写死,思路是找到返回JSON的接口);
  4. 从返回的JSON里找到play_addr字段,里面的URL就是无水印地址;
  5. 用下载工具把这个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。这种小自动化,日积月累能省下大量时间。

技术服务于需求,别为了折腾而折腾。找到一套自己顺手的方案,稳定用下去,比天天追新工具强得多。

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

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

立即咨询