先把话放这儿:B站缓存视频不能直接看,不是B站跟你过不去,而是它天生就把视频拆成了两半存着。很多朋友第一次摸到Android/data/tv.danmaku.bili/download这个目录,看到一堆数字文件夹,里面躺着一个video.m4s、一个audio.m4s和一个entry.json,整个人是懵的:我在B站缓存了一集纪录片,怎么到了手机里就成了一堆碎片?
这个问题的本质,是B站安卓客户端采用了自适应流媒体方案,把视频画面和声音分开存储。在线播放时播放器会实时把两段数据合在一起,但缓存到本地后,系统播放器不认识这种「半成品」结构,自然也就播不了。这篇博文要讲的,就是一套在Android端从B站缓存目录提取、合并、导出完整MP4的实操方案,我会把文件结构、工具选型、具体步骤、批量处理技巧和常见问题排查都过一遍。适合想把B站缓存视频导出来离线观看、剪辑素材、或者塞进NAS归档的朋友,也适合对Android文件管理和媒体封装原理感兴趣的折腾党。
我自己这些年折腾过不少缓存导出方案,踩过权限坑、合并坑、音画不同步坑,最终沉淀下来一套相对稳定的流程。这篇内容就是把这些经验整理出来,尽量用大白话讲清楚每一步在干什么,为什么要这么干。
1. 先把问题看清楚:B站缓存视频为什么不能直接看
1.1 B站缓存视频的真实存储结构
先说结论:B站安卓客户端的缓存文件,统一放在内部存储的Android/data/tv.danmaku.bili/download/目录下。tv.danmaku.bili是B站安卓客户端唯一的包名,这个目录在Android 10及以下版本还能通过一般文件管理器直接翻到,Android 11之后系统收紧了分区存储权限,普通文件管理器默认进不去,后面我会单独讲怎么破。
在这个下载目录里,每个视频会有一个以纯数字命名的文件夹,比如download/18283947/123456789/。这个数字ID一般对应视频的aid或cid,你不用记它具体是什么意思,只要知道这一层目录里就是单个视频的完整缓存数据就行。
打开这个文件夹,你会看到这些文件:
| 文件名 | 作用 |
|---|---|
video.m4s | 视频画面流,里面只有画面,没有声音 |
audio.m4s | 音频流,里面只有声音,没有画面 |
entry.json | 元数据文件,记录视频标题、UP主、分P名称、清晰度等 |
danmaku.xml | 弹幕文件,前提是你下载时勾选了「同时下载弹幕」 |
jpg/png图片 | 视频封面缩略图 |
有些视频会有多个分P,这种情况下download/下会有一个大数字文件夹,里面再按分P拆成多个小数字文件夹,每个小文件夹各自存一份video.m4s和audio.m4s。理解了这个树形结构,后面所有操作都不难。
1.2 为什么是m4s而不是一个完整的mp4
要搞懂这个问题,得稍微说一点流媒体协议。B站客户端在播放和缓存时用的是DASH(Dynamic Adaptive Streaming over HTTP)的思路,核心思路就是把一个视频拆成独立的视频轨和音频轨,按需加载。
这个设计在线播放时很合理:你拖动进度条,只需要加载画面流和声音流对应的那一段数据;切换清晰度,只需要替换视频轨的分辨率,音频轨可以继续复用,不需要重新缓冲。这就是为什么B站在线播放换清晰度时特别快。但代价是,缓存到本地的文件不是完整可播放的MP4,而是两个互不相干的数据流。
你可以这么理解:在线看视频像是去餐厅吃饭,厨师在后厨把菜切好、炒好、装盘端上来;缓存视频则像是B站把食材和调料分袋装好塞给你,告诉你回家自己炒。video.m4s就是那袋菜,audio.m4s就是那袋调料,两个都单独下锅是没法吃的,得拼在一起加工一下。
那为什么B站不干脆缓存一个完整MP4呢?一是MP4文件需要完整的moov元数据,边下载边写比较浪费存储资源;二是分轨存储更方便客户端做断点续传和清晰度切换。从产品角度讲,这是合理设计,只是对想导出视频的用户来说确实不友好。
1.3 「三步解锁」到底解锁了什么
网上有很多「三步解锁B站缓存视频」的教程,听起来很玄乎,好像有个开关藏在某个设置里。其实这「三步」的本质是:
- 找到缓存目录里的
video.m4s和audio.m4s - 把这两个文件从系统限制目录里复制出来
- 用工具把两个文件重新封装成一个标准MP4
整个过程没有解锁任何加密,也没有破解什么协议,纯粹就是把文件按正确方式拼回去。那些视频之所以看起来「被锁」,只是因为B站没有提供官方导出渠道,加上Android系统目录权限限制,而已。
搞清楚这点之后,你会发现网上各种「解锁」教程,核心内容都绕不开上面三件事。你差的不是某个神秘工具,而是对文件格式和封装逻辑的理解。
2. 工具选型:我实测过的三条路线
2.1 路线A:Scene,移动端最省心的选择
如果你不想折腾命令行,只想在手机上点几个按钮就把缓存视频导出,那Scene可以说是目前最合适的一款工具。这是一款开源的Android工具类应用,在GitHub上有项目主页,开发者一直保持更新。它内置了非常完整的B站缓存视频识别能力,可以自动扫描tv.danmaku.bili下载目录,识别出所有可导出的视频列表,并且明确标注每个视频包含哪些信息:标题、分P、时长、清晰度等。
Scene最大的优势是自动化程度高。你不需要自己理解m4s的封装细节,它会自动读取entry.json的内容,把散落的视频流和音频流重新封装成标准MP4,并且用视频标题自动命名。批量导出也很方便,勾选多个视频一次处理完。
安装方式是在GitHub的Releases页面下载APK文件安装。开源项目不会有乱七八糟的广告,这一点在我实测过的多个版本里都保持得很好。
提示:Scene除了B站缓存提取,还有很多本地媒体管理功能,但我不建议你一开始就全去研究,只把「B站缓存」相关的功能用好就很够了。
2.2 路线B:ffmpeg,终极通用方案
第二个路线是用ffmpeg。这个名字你可能在视频后期、转码相关的文章里见过,它是目前最强大的多媒体处理工具,没有之一。在Android端,最常见的用法是通过Termux安装ffmpeg,然后在命令行里执行合并操作。
Termux是Android上的终端模拟器,安装之后可以运行Linux环境下的命令。安装ffmpeg的命令很简单:
pkg update pkg install ffmpeg等到安装完成,进入缓存目录,执行下面这条命令,就能把视频流和音频流合并成一个MP4:
ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4关键参数是-c copy,意思是流复制,不重新编码。这个参数保证了合并过程几乎不消耗CPU,速度非常快,一个半小时的视频也就几十秒搞定,而且画质和音质完全无损。
ffmpeg路线的优点是上限极高,什么情况都能处理:多P批量合并、字幕提取、转封装、甚至修复损坏的时间戳都能做。缺点是学习成本高,命令行对小白不太友好,我建议至少从复制粘贴命令开始熟悉。
2.3 路线C:MT管理器,不需要命令行的手动操作
如果手机上有Root权限,或者用的是带文件访问能力的文件管理器,也可以不装ffmpeg,直接通过文件管理器把两个m4s文件选中,走「合并/封装」功能处理。MT管理器是我用过比较顺手的Android文件管理工具,它对m4s文件有专门的处理逻辑,选中video.m4s和audio.m4s后,在弹出的菜单里能找到「合并」或「转为MP4」之类的选项。
但这里要提醒一句:不是所有文件管理器的「合并」功能都能正确处理m4s。有些工具所谓的合并只是简单的二进制拼接,把两个文件首尾相接,这种操作对普通压缩包可能有用,对m4s这种需要重建封装结构的媒体流来说就是灾难,合出来的文件要么播放器不认,要么音画不同步。
所以如果你坚持走这个路线,一定要确认工具的合并功能是基于MP4封装逻辑实现的,而不是简单的copy /b拼接。Scene的合并功能是可靠的,MT管理器新版也做得不错,其他工具就要谨慎了。
2.4 三条路线的横向对比
| 对比维度 | Scene | ffmpeg + Termux | MT管理器 |
|---|---|---|---|
| 上手难度 | 低,图形化点选 | 高,需要命令行基础 | 中,菜单操作 |
| 批量处理 | 支持,勾选即可 | 支持,写循环脚本效率极高 | 支持,但操作繁琐 |
| 处理速度 | 快 | 极快 | 快 |
| 自动化程度 | 高,自动识别标题 | 需手动指定文件名 | 手动操作为主 |
| 适合人群 | 不想折腾、快速出片的用户 | 喜欢掌控细节、批量处理的用户 | 已经习惯用MT的用户 |
我个人现在的习惯是:手机端快速导出用Scene,需要批量整理或者处理复杂情况时用Termux写脚本。两个工具互补,基本覆盖了所有场景。
3. 实操演示:把缓存视频完整导出的三个核心步骤
3.1 第一步:从Android/data目录把缓存文件复制出来
这是现在很多新手卡住的第一关。Android 11之后,系统默认不允许文件管理器直接访问其他应用的私有目录,也就是Android/data下的内容。你在文件管理器里翻到Android/data文件夹,点进去可能看到的是空白,或者提示没有权限。
解决办法有几个,我按推荐程度排序:
第一种,用Scene自带的文件入口。因为Scene本身申请了管理所有文件的高权限,它内部的文件浏览器可以直接访问Android/data/tv.danmaku.bili/download。你在Scene里找到「B站缓存」相关功能,它会自动把这个目录读出来,根本不用你手动进系统文件管理器。
第二种,用MT管理器。MT管理器同样申请了「所有文件访问权限」,在它的侧边栏里可以直接输入路径跳转:
/storage/emulated/0/Android/data/tv.danmaku.bili/download/第三种,如果手机是Android 10或更早系统,直接用系统自带的文件管理器就能看到,不需要额外处理。
需要说明的是,我建议你在复制文件时,不要只复制video.m4s和audio.m4s,顺手把entry.json和封面图也一起复制出来。虽然合并不需要它们,但entry.json里记录着视频的标题、UP主、分P信息,后面整理素材库时会很有用。
3.2 第二步:用Scene完成抽取和转封装
复制出来之后,接下来的操作我用Scene举例,因为它对环境要求最少,几乎适合所有用户。
打开Scene,进入「视频工具」或者「B站缓存提取」相关的页面。不同版本的菜单名称可能略有差别,但核心流程是一致的:
- 设置输入目录,指向你刚才复制出来的缓存文件夹,也可以直接指向B站原始缓存目录
- 等待Scene扫描,它会列出所有识别到的视频,显示标题、时长、清晰度等信息
- 勾选需要导出的视频,设置输出目录(建议放到
Movies/B站缓存导出之类的文件夹) - 点击导出/合并,等待进度条跑完
整个过程中,Scene会读取entry.json里的标题作为输出文件名,所以导出的视频文件名是中文的,非常直观,不会出现一串看不懂的数字。
合并完成之后,用手机自带的播放器或者MX Player打开验证一下。正常会是一个画面、声音、时长都正确的标准MP4文件,可以随意复制到电脑、电视或者剪辑软件里使用。
3.3 第三步:加字幕、改文件名、整理入库
导出MP4只是第一步,离线观影体验要更好,还得做两件顺手的事。
第一件,处理弹幕。如果你缓存时勾选了「同时下载弹幕」,缓存目录里会有danmaku.xml。这个XML文件是B站私有的弹幕格式,普通播放器读不了,需要转换成通用的ASS字幕格式。转换工具网上有,比如「Danmaku2Ass」之类的命令行工具,在电脑上运行一下,就能把danmaku.xml转成一个.ass字幕文件。放到手机里,用MX Player打开视频,再挂载这个字幕文件,弹幕就能以字幕形式显示出来。有一说一,这个效果和B站在线弹幕观感还是有差异的,但至少能保留历史弹幕的密度和情绪。
第二件,整理文件名。Scene导出的文件名一般以B站视频标题为准,但这个标题可能包含一些特殊符号或者很长。我习惯在导出后按「片名_清晰度_日期.mp4」的格式重命名,比如「三体解说_1080P_20250101.mp4」,这样放进NAS或电脑媒体库时,刮削器和分类工具识别起来更准确。你也可以顺手建一个封面文件夹,把封面图放进去,方便以后做合集封面或者海报墙。
3.4 关于清晰度和画质的关键说明
合并导出的MP4,画质完全等同于你缓存时的清晰度。如果在B站客户端下载时选的是720P,导出来就是720P,不会因为你合并它而变模糊,也不会变清晰。很多人以为有个工具能让缓存视频「解锁」成高码率原画,这是不存在的,缓存文件里存的是什么画质,导出就是什么画质。
另一个关键点是:合并过程一定要用流复制(-c copy),也就是只做封装,不改编码。有些工具默认会重新编码,把H.264转成H.265,或者改变计算码率,这不仅会消耗大量时间,还会造成不必要的画质损失。Scene和ffmpeg默认都是流复制,但如果你用的工具带转码选项,记得关掉。
注意:合并后的MP4虽然能播放,但原始缓存目录里那份
video.m4s和audio.m4s也别急着删。我个人的习惯是把原始缓存再存一份到移动硬盘里,当作无损原始素材。因为MP4只是重新封装,理论上和m4s内容完全一致,但万一封装工具存在兼容性问题,原始文件还能用来重新处理。
4. 进阶操作:批量处理与脚本自动化
4.1 多P视频的批量合并
B站很多视频是合集形式,比如纪录片、课程、系列剧集,缓存下来之后会有几十个分P,每个分P一个目录。如果一个个手动用Scene导出,效率太低,这种场景我强烈建议用ffmpeg脚本批量处理。
在Termux里,先cd到B站缓存的上级目录,然后执行一段简单的循环脚本:
for d in */; do if [ -f "${d}video.m4s" ] && [ -f "${d}audio.m4s" ]; then echo "正在处理: ${d}" ffmpeg -i "${d}video.m4s" -i "${d}audio.m4s" -c copy "${d%/}.mp4" fi done这段脚本的逻辑很简单:遍历当前目录下所有子文件夹,如果发现里面同时存在video.m4s和audio.m4s,就用ffmpeg把两个流复制合并成同名MP4。我实测过,一个20集的合集,全自动跑下来不到五分钟,中途不需要任何人工干预。
跑完之后,如果发现某些视频合并失败,多半是文件名或者目录结构有特殊情况,单独定位处理就好。脚本的好处是你能清楚地看到哪些文件出了问题,不用一个个点。
4.2 元数据的保留:封面和弹幕别丢
前面讲了要保留entry.json和封面图,这里再展开说下为什么。entry.json是个JSON格式的文本文件,用文本编辑器打开,能看到视频的标题、简介、UP主名字、分区、分P名称等信息。这个文件相当于视频的身份证。
如果你有整理个人媒体库的习惯,比如用NAS上的媒体管理软件(如Jellyfin、Emby)建立影片墙,那么把entry.json一起保留下来会非常有用。很多媒体管理工具可以通过NFO文件识别影片信息,你可以写一个小脚本把entry.json里的字段提取出来,生成对应的NFO文件,这样导入媒体库后,海报、简介、演职人员信息都能自动匹配上。
弹幕文件也一样。虽然转换成ASS字幕需要额外操作,但保留原始的danmaku.xml不占多少空间,以后想看弹幕随时可以转。不建议为了省空间直接删掉。
4.3 编码、容器与兼容性的选择建议
默认情况下,合并出来的MP4用的是H.264/AAC编码,封装格式是MP4。这种组合的兼容性最好,几乎所有播放器都能播,剪辑软件也认,是最稳妥的选项。
有些朋友可能会问:能不能直接转成MKV?能不能把音频转成AAC 5.1声道?技术上都可以,都是ffmpeg一行命令的事,但我不太建议在缓存视频上做这些加工。理由很简单:B站缓存视频的音频源本身也不是无损音轨,转成什么格式都提升不了音质,反而可能因为转码损失细节。保持原汁原味的H.264+AAC+MP4,是兼容性和效率的最优解。
如果你的目标是放进苹果设备(iPhone、iPad)里离线观看,MP4格式同样没问题,用「文件」App或者第三方播放器(如Infuse、nPlayer)都能直接播放,不需要转码。
5. 常见问题与排查技巧实录
5.1 问题速查表
我总结了自己实际踩过的一些坑,以及身边朋友问得比较多的问题,整理成一张速查表:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
Android/data目录点进去是空白的 | Android 11+分区存储限制 | 改用Scene或MT管理器的文件入口,或给文件管理器开「所有文件访问权限」 |
缓存文件夹里只有video.m4s,没有audio.m4s | 缓存不完整 | 回到B站客户端删除该缓存,重新缓存一次 |
| 合并后没有声音 | 合并时只选了视频流,没选音频流 | 用ffmpeg把两个文件都加进去,或者用Scene重新导出 |
| 合并后音画不同步 | 用了简单二进制拼接,不是MP4封装 | 改用ffmpeg或Scene,不要用简单的文件连接工具 |
| 导出后的文件在电脑上播放卡顿 | 可能是缺少faststart参数 | ffmpeg加-movflags +faststart,让元数据移到文件头部,方便网络播放 |
| 有些合集只导出了几集 | B站缓存时部分分P没有完整下载 | 回到B站检查缓存目录,或者重新下载缺失分P |
| 弹幕文件转ASS后时间轴偏移 | xml里时间戳与视频实际时间有偏差 | 用字幕工具调整全局偏移量,一般偏移在几百毫秒内 |
5.2 音画不同步的深层原因
音画不同步这事值得单独拎出来讲。很多人一遇到这种问题,第一反应是「文件坏了」或者「播放器有毛病」,其实根源往往在合并方式上。
简单二进制拼接就是把两个文件直接首尾相连,中间没有建立任何时间戳和索引关系。MP4文件内部有一个复杂的元数据结构,记录着每一帧视频和每一段音频对应的播放时间。如果合并工具没有重建这些时间戳,播放器就无法判断视频帧和音频帧该在哪个时间点输出,结果就是画面走画面的、声音走声音的,越到后面偏得越厉害。
ffmpeg和Scene这类专业工具在合并时会做「混合封装」(mux),它们会读取两个流的内部时间戳,重新生成时间轴索引,保证声音和画面同步。所以遇到音画不同步,别想着修,直接换正确的工具重新合并就行。
5.3 Android/data目录权限被限制的几种处理姿势
Android 11以上的分区存储限制,是让很多人头疼的大问题。除了用Scene这类高权限工具,还有几个办法可以试。
第一种,在系统设置里给文件管理器开「所有文件访问权限」。具体路径一般是:设置 → 应用管理 → 找到文件管理器App → 权限 → 特殊应用权限 → 所有文件访问权限 → 允许。开启后,文件管理器就能访问Android/data目录了。这个方法只建议给正规可信的文件管理器开,别随便给来路不明的App授予这种高权限。
第二种,用「内容URI」的方式访问。有些文件管理器会通过系统的文档选择器进入应用私有目录,比如某些手机厂商自带的文件App,在侧边栏会有一个「Android/data」入口,点进去能看到其他应用的缓存目录。这种方法不需要额外授权,但不同手机实现方式不一样。
第三种,用ADB从电脑端拉取文件。如果你熟悉电脑操作,可以开启USB调试,用ADB命令把缓存目录整个复制到电脑上:
adb pull /sdcard/Android/data/tv.danmaku.bili/download/ ./bili_cache/ADB方案适合想一次导出大量缓存的场景,不受手机端任何限制,缺点是需要电脑和数据线。
5.4 遇到缓存文件无法正常导出的特殊情况
有些B站的内容,比如需要付费购买才能观看的充电视频、或者部分有版权保护的区域独播番剧,缓存逻辑和普通视频不一样,有时你会发现合并出来的MP4画面是花的、或者只有声音没有画面,甚至导出时工具直接报错。
这种情况大概率是缓存文件经过了加密或者特殊处理,本地播放需要依赖B站客户端的解密逻辑。我个人不推荐在这类内容上折腾,原因很现实:一是绕过DRM或解密机制本身有可能涉及版权问题,二是即使花大力气弄出来,画质和稳定性也没有保障。真正的做法是尊重版权,需要长期离线观看的内容,直接在客户端里离线观看就好,客户端自己的播放器能正常解密播放。
普通UP主发布的免费视频,缓存逻辑基本都是标准的m4s分轨结构,不会有加密问题,放心折腾就行。
关于这套方案,我最后说几句实在的
整个B站缓存视频导出这件事,说穿了就是一个「认识文件结构、选择合适工具、正确合并封装」的流程。我自己从最早用电脑端ffmpeg处理,到后来发现Scene能在手机上直接完成,最大的体会是:工具在进步,但底层原理没变过,把m4s和封装这两个概念搞清楚,以后不管B站客户端怎么改缓存逻辑,你都能很快找到新的处理方案。
我现在养成的习惯是,在B站看到值得收藏的长视频或者纪录片,会先切换到最高清晰度缓存下来,等碎片时间用Scene导出,再统一归档到NAS。这样既不会占手机存储,又能随时在电视或者电脑上重温。你要是也想长期做离线视频归档,强烈建议在手机里同时备好Scene和Termux这两样工具,一个负责日常导出,一个负责批量处理和疑难杂症,基本就齐活了。
最后再分享一个小技巧:在B站客户端的设置里,找到「下载设置」,把「默认清晰度」调到你能接受的最高档。很多人缓存时没注意到清晰度选项,默认只有720P甚至更低,等你导出完才发现画质拉胯,那就只能重新缓存一遍了。先把源头设置好,导出的片源质量才有保证。