资讯动态

B站缓存M4S转MP4全攻略:从文件结构到FFmpeg合并

发布时间:2026/10/3 15:28:14 来源:尧图企业网站定制
B站手机客户端缓存视频这个功能,很多人每天都在用,但真正打开过缓存目录的人不多。直到某天你想把缓存好的视频导出来剪辑或者转到电脑上看,才发现文件夹里躺着一堆.m4s后缀的文件,既没封面也打不开,直接改后缀名成.mp4也没用——能出画面但没声音,有的干脆黑屏。这事的罪魁祸首就是B站缓存采用的DASH流媒体分段策略:一条视频被拆成视频轨和音频轨两个独立文件,通通塞进.m4s容器里。网上搜解决方案,十个有九个让你装 FFmpeg 在命令行里敲命令,对不会用终端的用户相当劝退。这篇我就从文件结构、缓存路径、一键转换工具、FFmpeg 手动合并几个角度,把B站M4S转MP4这件事彻底讲明白。1. M4S缓存文件到底是个啥1.1 拆开看:B站缓存的目录结构如果你把手机连接到电脑,打开Android数据目录下的B站文件夹,会看到类似下面这样的层级:Android/data/tv.danmaku.bili/download/ └── 1234567890/ # 缓存批次ID └── 9876543210/ # 视频ID └── 64/ # 清晰度代号(即清晰度标识) ├── audio.m4s ├── video.m4s ├── entry.json └── danmaku.xml不同版本、不同时间段缓存出来的命名会有区别,老版本可能直接叫0.m4s、1.m4s,或者干脆是一个没有后缀的文件,新版本统一收敛成了video.m4s和audio.m4s,这反而清晰了不少。64这个数字代表清晰度档位,常见的有64(720P)、32(480P)、80(1080P)等,不同时期对应关系略有区别。entry.json记录视频标题、分P信息、清晰度参数等元数据,danmaku.xml是弹幕文件。顺手说一下,绝大多数用户在 ES文件浏览器、MT管理器里能看到的是Android/data路径下的内容。但从 Android 11 开始,系统对Android/data目录的访问限制非常严格,自带的文件管理器往往看不到,你需要在电脑上通过USB传输模式访问,或者用支持All Files权限的第三方管理器。这是一个非常容易卡住的点,后面会展开讲。1.2 M4S和MP4的关系:不止是改个扩展名M4S的全称是MPEG-4 Segment,它本质上是MP4容器的一种分段封装形式,常见于MPEG-DASH自适应流媒体传输。所谓DASH,简单理解就是服务器把一段视频切成很多小片段,每个片段几秒钟,播放器边播边下,画质还能自适应切换。HLS用的.ts分段也是类似的思路,只不过格式不同。B站App把视频整个缓存到本地后,并没有把这些分段合并回一个完整MP4,而是把视频轨和音频轨分别保留成了两个分段流文件。video.m4s里面装着H.264或HEVC编码的视频数据,audio.m4s里面装着AAC编码的音频数据。这两个文件虽然后缀都带MP4的血统,但实际上缺了MP4封装里很重要的索引信息,单独拿出来用播放器播放,播放器完全不知道该怎么读。我见过很多人直接把这俩文件改名成.mp4,然后丢进播放器,结果只有画面没有声音,或者连画面都出不来,原因就在这里——你改的只是外部文件名,文件内部的封装结构压根没变。要让它可以正常播放,至少要经过“把视频轨和音频轨放进同一个MP4容器”这一步,专业说法叫混流(Muxing)或重封装(Remux),本质上是把两个轨道的数据重新打包到一个真正的MP4容器里,尽可能不去动视频和音频的编码数据,所以速度非常快。2. 先解决文件来源问题:缓存目录去哪找2.1 Android端的查找路径B站缓存文件在Android端默认存放在App外部存储目录,标准路径是:/storage/emulated/0/Android/data/tv.danmaku.bili/download/如果你用数据线连接电脑,在“内部存储”里展开这个路径,就能看到一串数字命名的文件夹。每个文件夹对应一次缓存任务,里面再按视频ID和清晰度分层。找到带有video.m4s和audio.m4s的最内层文件夹,这就是我们要处理的源文件所在。在手机本地上找的话,得换个思路。Android 11 以后的系统强制了分区存储机制,普通文件管理器打开Android/data目录会被拒绝,除非你给APP授予“所有文件访问权限”,或者用电脑来操作。我的建议是:优先用电脑找,又快又省事。数据线连上后,手机端选“传输文件”,电脑上直接按路径进;如果电脑端也看不到Android/data,多半是手机驱动或MTP协议的问题,可以先在其他手机管理软件里切换一下传输协议,或者重启手机再插一次。2.2 特殊情况:多P视频和清晰度目录B站缓存目录层级里,视频ID文件夹下面通常还会有一层用数字命名的文件夹,这个数字就是清晰度等级。多P视频往往会有多个并列的文件夹,每个P对应一个子目录。如果你只想转其中某一集,点进对应数字文件夹就能找到那一集的video.m4s和audio.m4s。还有一个小细节:部分较老的B站版本缓存结构里,视频轨文件名是dvi或0.m4s,音频轨是0.m4s或1.m4s,没有固定的video.m4s/audio.m4s命名。这时候怎么区分哪个是视频、哪个是音频?最简单的办法是看文件大小——视频轨通常比音频轨大好几倍,尤其是高清片源。也可以用文本编辑器打开看一眼开头的原子信息,以ftyp开头的是MP4系列容器,里面如果能看到vide相关的内容一般是视频轨,能看到soun相关的是音频轨。筛选的时候我还有一个经验:把entry.json也一起复制出来。这个文件虽然只有几十KB,但记录了视频标题、分P名称、清晰度、下载时间等关键信息。转完文件后回头核对,或者给输出文件自动命名,都能用到。3. 一键转换工具:不用敲命令也能搞定3.1 工具原理:其实也是解析容器很多用户一听到“命令行”就头大,还好市面上已经有不少图形界面的“M4S合并工具”“B站缓存转换器”,操作基本就是选文件夹、点按钮、输出MP4三步。它们的原理并不玄乎,本质上就是手动实现了MP4容器的解析和重封装:读入video.m4s提取视频轨,读入audio.m4s提取音频轨,再按照MP4规范重新生成一个包含两条轨道的MP4文件。绝大多数成熟的转换工具还会自动处理音频轨前置、时间戳对齐、moov原子位置调整这些细节,普通用户不需要理解,但背后每一步都有讲究。选择工具时,我建议优先找开源或至少知名度较高、更新时间较新的项目。搜索关键词用“m4s合并工具”“b站缓存转mp4”“m4s转mp4”都能找到一堆结果。那些需要联网上传、注册账号、甚至收费的在线转换网站,我劝你别碰——本地视频文件属于个人隐私,上传第三方服务器既有泄露风险,处理速度还受带宽限制,几百MB的视频传半天,不划算也不安全。本地离线工具哪怕界面丑一点,至少数据不出设备。3.2 实操流程:选文件、点转换、验收以目前比较常见的图形界面合并工具为例,完整流程大致是:定位缓存根目录或视频子目录。部分工具支持直接选择B站下载目录的根路径,自动扫描所有.m4s文件对;部分工具需要你手动选中含视频轨和音频轨的文件夹。两种设计都行,但如果你缓存文件很多,支持批量扫描的版本会省去大量重复操作。确认视频轨与音频轨对应关系。工具界面里一般会列出识别到的视频文件和音频文件,并让你确认它们是同一集。正常抓取不会出错,但若目录里混有多个视频文件,最好逐一点开核对时长是否一致。设置输出目录和命名规则。建议输出目录和缓存目录分开,免得原文件被误覆盖。命名规则里带上标题或时间戳,后续整理更轻松。点击转换,等待完成。由于全程不重新编码,理论上转换速度非常快,一个几百MB的视频通常几秒钟就能完成,具体取决于磁盘读写速度。真正的瓶颈往往是硬盘IO,而不是CPU。用播放器验证结果。转换完成后别急着删源文件,先打开MP4确认画面、声音都正常,再清理缓存。3.3 工具避坑:这几种别乱用现在网上搜“m4s转mp4”,能搜出大量来源不明的工具包。我见过的坑主要有三类:第一类是捆绑安装型,一个自称“一键转换”的exe,装完发现桌面多了好几个全家桶软件,转换功能反而没法用。这类工具十有八九是商业推广入口,直接卸载就行。第二类是在线转码型,网站让你上传M4S文件再下载MP4,先不说隐私问题,很多B站缓存视频动辄几百MB甚至几个GB,上传速度加上服务器排队,等半小时也未必转完,转完还可能有水印。本地工具两秒钟能干完的事,真没必要绕这个远路。第三类是功能阉割型,只支持某一种固定目录格式,遇到不同版本的缓存结构就罢工,要么找不到文件,要么合并出来没有声音。我建议从工具开发者的更新日志和issue区看看它最近是否还在维护,是否有人反馈过类似问题,再决定用不用。我自己的个人经验是:工具越“傻瓜”,越要留个心眼,优先选择开源项目或比较流行的、社区验证过的工具,并且下载时优先从官网或代码托管平台获取,不要从不知名的小网站下安装包。4. 进阶方案:FFmpeg手动合并的完整套路4.1 最基础的合并命令一键工具虽然方便,但总有翻车的时候——比如遇到B站缓存目录的变体结构、遇到工具不支持的编码格式、或者工具本身年久失修。这时候,学会最基本的 FFmpeg 命令能救命。FFmpeg 是一个开源的多媒体处理框架,支持几乎所有音视频格式的读取、转换、编码、封装。如果电脑上已经安装了 FFmpeg,手动合并video.m4s和audio.m4s只需要一行命令:ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4我来拆解一下这条命令做了什么:-i video.m4s和-i audio.m4s分别指定输入的视频轨和音频轨;-c copy表示对编码数据不做任何重新压缩,直接复制到输出容器;输出文件是output.mp4。整个过程中视频的H.264/HEVC编码数据和音频的AAC编码数据都不会被重新解码、编码,所以转换速度快得惊人,画质音质也完全无损。唯一需要留意的是,这条命令要求FFmpeg能够自动识别两个输入的轨道并正确排序。多数情况下,FFmpeg会自动把第一个输入识别为视频轨、第二个输入识别为音频轨,输出MP4时自动封装成一条视频流加一条音频流的正常结构。如果顺序错了,或者输入文件里有额外的轨道,可以在命令里用-map显式指定:ffmpeg -i video.m4s -i audio.m4s -map 0:v -map 1:a -c copy output.mp4-map 0:v的意思是“取第一个输入文件中的视频流”,-map 1:a是“取第二个输入文件中的音频流”。显式指定映射可以杜绝某些边缘情况下轨道选错的问题,比如偷偷混进了一条音轨。4.2 当基础命令失效时:排查与修复很多时候直接用这条-c copy命令就够了,但我也遇到过翻车场景——最常见的是m4s文件的moov原子不在文件头部,导致FFmpeg无法正常索引轨道。MP4容器有一个特性:moov原子记录了整个文件的轨道信息,如果它在文件末尾,播放器就必须把整个文件读完才能开始播放,某些工具解析这类文件时就直接报错了。遇到这种情况,可以先用FFmpeg对输入文件做一次“重封装”,把moov原子挪到文件开头:ffmpeg -i video.m4s -c copy -movflags faststart video_fixed.mp4 ffmpeg -i audio.m4s -c copy -movflags faststart audio_fixed.mp4 ffmpeg -i video_fixed.mp4 -i audio_fixed.mp4 -c copy output.mp4-movflags faststart这个参数就是让FFmpeg在输出MP4时,把moov原子写到文件头部,这样兼容性会大幅提升,尤其适合需要在手机上播放的场景。另一个常见问题是两个m4s文件的时长不完全一致,导致合并后音画不同步。这个问题的根源通常是网络缓存时,视频轨和音频轨的切片数量不同,或者最后一个切片的数据不完整。解决办法不是硬转,而是检查源文件是否完整:把video.m4s和audio.m4s分别用FFmpeg跑一下时长,确认两者差异是否在合理范围内。ffprobe video.m4s ffprobe audio.m4sffprobe是FFmpeg自带的媒体信息查看工具,执行后能看到文件的时长、码率、编码格式、分辨率等信息。如果视频轨时长是120秒,音频轨是118秒,差距明显,那说明缓存过程确实出了问题,最靠谱的解决方法是回B站App里重新缓存一遍;如果差异只有几十毫秒,属于正常情况,直接合并就能用。4.3 批量处理与日常操作合并缓存文件一多,单个文件接个文件地敲命令也很痛苦。放一个我常用的Windows批处理脚本,把要转换的目录拖进来自动处理:echo off chcp 65001 nul setlocal enabledelayedexpansion for /d %%d in (*) do ( if exist %%d\video.m4s if exist %%d\audio.m4s ( ffmpeg -y -i %%d\video.m4s -i %%d\audio.m4s -c copy %%d.mp4 nul 21 if !errorlevel! equ 0 ( echo 成功: %%d.mp4 ) else ( echo 失败: %%d ) ) ) echo 全部处理完成。 pause注意脚本里的中文输出,Windows批处理默认编码是GBK,所以我用了chcp 65001切到UTF-8。路径里有空格会出问题,所以每个路径都加了英文引号。批处理只能扫描当前目录下的子文件夹,如果你的缓存是三层嵌套结构,得先进入最内层目录再执行。macOS或Linux用户直接在终端里跑一个for循环即可:for dir in */; do if [ -f $dir/video.m4s ] [ -f $dir/audio.m4s ]; then ffmpeg -y -i $dir/video.m4s -i $dir/audio.m4s -c copy $dir.mp4 fi done如果你是工具类用户,不想碰命令行,也可以找支持“批量添加文件夹”的图形化合并工具,把多个目录一起拉进去,点一下全部转换,效果等价。5. 常见问题与排查技巧实录5.1 “播放不了”还是“播放器不支持”很多人千辛万苦把m4s转成了MP4,结果播放器一打开还是黑屏或提示无法解码。先别怀疑转换有问题,先区分是容器问题还是编码问题。B站高清视频现在普遍使用H.264编码,兼容性没问题,这是目前最通用的视频编码,智能电视、手机、电脑播放器基本都支持。但部分4K或高码率内容用的是HEVC(H.265)编码,这种编码不是所有播放器都自带解码能力。如果你的输出文件用系统自带播放器“万能解码器”打不开,换成PotPlayer、VLC、MPV这类解码能力强的播放器试试,十有八九能放。5.2 合并失败或提示“无音频轨”转换工具在合并时报告找不到音频轨或音频轨无法识别,先检查audio.m4s文件本身是否为空或损坏。看文件大小:正常一个几分钟视频的音频轨不会太小,如果只有几KB,说明缓存时音频流就没下载完整。处理办法很直接:重新下载该视频,或者去B站网页端用其他方式获取完整视频。顺便说一句,老版本缓存里video.m4s和audio.m4s可能存在代码文件名不同的情况,比如音频文件叫64.m4s,视频文件叫0.m4s,合并前一定核对清楚。5.3 转换后音画不同步如果合并后声音和画面差了那么零点几秒,让人浑身不舒服,大概率是缓存过程中极端情况丢了一个切片,或者两个轨道的起始时间戳不完全对齐。可以用FFmpeg做音频延迟补偿,先把音频前移或后移:ffmpeg -i video.m4s -i audio.m4s -af adelay200|200 -c:v copy output.mp4-af adelay200|200表示给左右声道各延迟200毫秒。如果你发现声音比画面领先了200毫秒,就用这个命令,把视频轨-c:v copy原样保留,只对音频轨做延迟。如果声音滞后,用-af aresampleasync1:first_pts0这种重采样纠偏也可以,但参数比较复杂,新手不建议乱调。这种情况更推荐重新转一次,核对源文件是否完整。5.4 转出来的MP4文件巨大,想压小-c copy保留了原始码率,所以输出的MP4大小和缓存文件总和差不多,不会减少。想压缩体积,就得做真正的转码,用H.264的CRF模式控制画质和体积的平衡:ffmpeg -i video.m4s -i audio.m4s -vcodec libx264 -crf 23 -acodec aac -b:a 128k output.mp4CRF值越小画质越高、体积越大,23是画质和体积相对均衡的默认值;如果不在乎体积想保留高画质,可以用18;如果只是传到手机临时看,28也不是不行。注意转码会消耗大量CPU时间,一个30分钟的视频,普通笔记本可能要跑十几分钟,不像-c copy那样秒完。5.5 m4s转MP3:只要音频不要画面有时候缓存了一场直播回放或者音频节目,你只想要音频,那就直接抽音轨:ffmpeg -i audio.m4s -vn -acodec libmp3lame output.mp3或者不转码,只抽取并封装成m4a:ffmpeg -i audio.m4s -vn -c copy output.m4a两种方式都行,前者体积更大兼容性更强,后者速度快音质无损,看你的播放设备支持哪种。几个实用经验和避坑心得说几条实际操作里踩过的坑,工具党尤其注意。第一,转换前备份源文件。-c copy这类操作不会修改源文件,但图形工具里万一输出目录和源目录设成同一个,又恰好支持覆盖写,就可能把源文件覆盖成半成品。所以每次转换前,我都习惯把源m4s文件夹完整复制一份到临时目录,转换确认没问题后再清理。虽然多占点空间,但保险值这个价。第二,善用entry.json来判断清晰度。这个文件里通常有quality或者类似的字段,能看到缓存时选的是什么清晰度。有人转完发现分辨率只有480P,还以为工具不给力,其实是缓存时格式选的就是低清,工具再强也变不出高清源。第三,弹幕文件也别急着丢。danmaku.xml是标准XML格式,如果想保留弹幕,可以搜“B站弹幕转换ass”,有现成工具把XML弹幕转成字幕文件,配合合并好的MP4放到播放器里,效果很接近在线观看。这个转换流程,从“搞不清m4s是什么”到“跑通一键工具”,再到“学会FFmpeg手动兜底”,是一套难度递进但收益明显的技能包。大多数场景下,一个可靠的图形化合并工具就够了;万一遇到工具失效,手头有FFmpeg命令也不会被卡住。最后再分享一个我自己的使用习惯:转完的MP4,统一丢进媒体库,按“年份/月份/标题”整理,再用ffprobe给每个文件生成一个简单的mediainfo文本,方便以后查找片源信息。这套流程我用了好几年,目前没翻过车。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑