
先把话放这儿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站客户端在播放和缓存时用的是DASHDynamic 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 路线AScene移动端最省心的选择如果你不想折腾命令行只想在手机上点几个按钮就把缓存视频导出那Scene可以说是目前最合适的一款工具。这是一款开源的Android工具类应用在GitHub上有项目主页开发者一直保持更新。它内置了非常完整的B站缓存视频识别能力可以自动扫描tv.danmaku.bili下载目录识别出所有可导出的视频列表并且明确标注每个视频包含哪些信息标题、分P、时长、清晰度等。Scene最大的优势是自动化程度高。你不需要自己理解m4s的封装细节它会自动读取entry.json的内容把散落的视频流和音频流重新封装成标准MP4并且用视频标题自动命名。批量导出也很方便勾选多个视频一次处理完。安装方式是在GitHub的Releases页面下载APK文件安装。开源项目不会有乱七八糟的广告这一点在我实测过的多个版本里都保持得很好。提示Scene除了B站缓存提取还有很多本地媒体管理功能但我不建议你一开始就全去研究只把「B站缓存」相关的功能用好就很够了。2.2 路线Bffmpeg终极通用方案第二个路线是用ffmpeg。这个名字你可能在视频后期、转码相关的文章里见过它是目前最强大的多媒体处理工具没有之一。在Android端最常见的用法是通过Termux安装ffmpeg然后在命令行里执行合并操作。Termux是Android上的终端模拟器安装之后可以运行Linux环境下的命令。安装ffmpeg的命令很简单pkg update pkg install ffmpeg等到安装完成进入缓存目录执行下面这条命令就能把视频流和音频流合并成一个MP4ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4关键参数是-c copy意思是流复制不重新编码。这个参数保证了合并过程几乎不消耗CPU速度非常快一个半小时的视频也就几十秒搞定而且画质和音质完全无损。ffmpeg路线的优点是上限极高什么情况都能处理多P批量合并、字幕提取、转封装、甚至修复损坏的时间戳都能做。缺点是学习成本高命令行对小白不太友好我建议至少从复制粘贴命令开始熟悉。2.3 路线CMT管理器不需要命令行的手动操作如果手机上有Root权限或者用的是带文件访问能力的文件管理器也可以不装ffmpeg直接通过文件管理器把两个m4s文件选中走「合并/封装」功能处理。MT管理器是我用过比较顺手的Android文件管理工具它对m4s文件有专门的处理逻辑选中video.m4s和audio.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.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.264AACMP4是兼容性和效率的最优解。如果你的目标是放进苹果设备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甚至更低等你导出完才发现画质拉胯那就只能重新缓存一遍了。先把源头设置好导出的片源质量才有保证。