# m4s_to_mp4 **Repository Path**: Little_Code_Farmer/m4s_to_mp4 ## Basic Information - **Project Name**: m4s_to_mp4 - **Description**: 将m4s音频、视频文件合并为MP4文件 - **Primary Language**: Unknown - **License**: Zlib - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-12-01 - **Last Updated**: 2024-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [TOC] ### B站缓存视频转MP4(js + ffmpeg ) **注意:这样的方式只用于个人之间不同设备的离线观看。请勿用于商业用途!!** 可见: https://blog.csdn.net/qq_44708990/article/details/134741677?spm=1001.2014.3001.5501 ### 1、说明 > 目前b站下载的视频并不是 **mp4** 格式的,而是 **m4s** (两个 **m4s** 文件,分别代表音频文件和视频文件);需要用 **ffmpeg** 将两个文件合并成一个 **mp4** 文件 ```txt Android\data\tv.danmaku.bilibilihd\download 内部一个目录代表一个缓存项 一个缓存项内部可能会有多个目录代表视频不止一个(多集);否则就是一个视频 - 视频id |-- 某一集 |---- 某一集的相关信息 json (一般为entry文件) |---- 某一集视频的具体音频内容 目录(内部有存放 m4s 文件:video.m4s、audio.m4s ) ``` - 两个缓存项: ![image-20231201171310596](C:\Users\81334\AppData\Roaming\Typora\typora-user-images\image-20231201171310596.png) - 多集:id为47231894的视频有两集 ![image-20231201171156670](C:\Users\81334\AppData\Roaming\Typora\typora-user-images\image-20231201171156670.png) ### 2、ffmpeg #### 2.1 下载地址 **[https://www.onlinedown.net/soft/616370.htm#downBox](https://www.onlinedown.net/soft/616370.htm#downBox)** 下载后先解压到特定目录(譬如:**D:\ffmpeg\bin**) ![image-20231201172825289](C:\Users\81334\AppData\Roaming\Typora\typora-user-images\image-20231201172825289.png) #### 2.2 配置环境变量 打开环境变量(用户变量和系统变量都可以;此处修改的是用户变量)。新建变量,定位至 bin 目录(**PS. 可以不配置环境变量,后续执行该命令时用绝对路径就可以**) image-20231201172349779 #### 2.3 测试 ```bash # 已配置环境变量:打开命令行窗口,输入 ffmpeg -version # 已配置环境变量:需要先定位到目录(D:\ffmpeg\bin);再执行对应的exe文件 D:\ffmpeg\bin\ffmpeg.exe -version ``` #### 2.4 转换MP4命令 ```bash # ffmpeg [-i m4s文件地址 -可使用多次] -codec copy "生成的MP4名称" ffmpeg -i ./47231894/4712384/video.m4s -i ./47231894/4712384/audio.m4s -codec copy ./result.mp4 ``` ### 3、处理程序 **PS. 可使用别的语言,java,py等等(作用都是获取 ffmpeg 的参数,拼接命令),实际就是通过DOS多次执行 ffmpeg 命令** 3.1 获取所有缓存项 3.2 遍历缓存项,读取 entry.json 文件,拿到 title 属性,以该名称创建目录;内部存放视频 3.3 缓存项有多集:以 entry.json 文件内部的 page_data.part 属性为MP4文件名称 3.4 缓存项有单集:以 entry.json 文件内部的 title 属性为 MP4 文件名称 3.5 拼接ffmpeg参数,音频、视频地址,输出的文件地址;