B站缓存视频m4s格式解析与合并导出MP4完整实操指南
2026/9/20 18:13:42 网站建设 项目流程

先把话放这儿: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.m4saudio.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站缓存视频」的教程,听起来很玄乎,好像有个开关藏在某个设置里。其实这「三步」的本质是:

  1. 找到缓存目录里的video.m4saudio.m4s
  2. 把这两个文件从系统限制目录里复制出来
  3. 用工具把两个文件重新封装成一个标准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.m4saudio.m4s后,在弹出的菜单里能找到「合并」或「转为MP4」之类的选项。

但这里要提醒一句:不是所有文件管理器的「合并」功能都能正确处理m4s。有些工具所谓的合并只是简单的二进制拼接,把两个文件首尾相接,这种操作对普通压缩包可能有用,对m4s这种需要重建封装结构的媒体流来说就是灾难,合出来的文件要么播放器不认,要么音画不同步。

所以如果你坚持走这个路线,一定要确认工具的合并功能是基于MP4封装逻辑实现的,而不是简单的copy /b拼接。Scene的合并功能是可靠的,MT管理器新版也做得不错,其他工具就要谨慎了。

2.4 三条路线的横向对比

对比维度Sceneffmpeg + TermuxMT管理器
上手难度低,图形化点选高,需要命令行基础中,菜单操作
批量处理支持,勾选即可支持,写循环脚本效率极高支持,但操作繁琐
处理速度极快
自动化程度高,自动识别标题需手动指定文件名手动操作为主
适合人群不想折腾、快速出片的用户喜欢掌控细节、批量处理的用户已经习惯用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.m4saudio.m4s,顺手把entry.json和封面图也一起复制出来。虽然合并不需要它们,但entry.json里记录着视频的标题、UP主、分P信息,后面整理素材库时会很有用。

3.2 第二步:用Scene完成抽取和转封装

复制出来之后,接下来的操作我用Scene举例,因为它对环境要求最少,几乎适合所有用户。

打开Scene,进入「视频工具」或者「B站缓存提取」相关的页面。不同版本的菜单名称可能略有差别,但核心流程是一致的:

  1. 设置输入目录,指向你刚才复制出来的缓存文件夹,也可以直接指向B站原始缓存目录
  2. 等待Scene扫描,它会列出所有识别到的视频,显示标题、时长、清晰度等信息
  3. 勾选需要导出的视频,设置输出目录(建议放到Movies/B站缓存导出之类的文件夹)
  4. 点击导出/合并,等待进度条跑完

整个过程中,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.m4saudio.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.m4saudio.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甚至更低,等你导出完才发现画质拉胯,那就只能重新缓存一遍了。先把源头设置好,导出的片源质量才有保证。

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

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

立即咨询