在将 m3u8、ts 等文件下载完毕后,通过以下命令转换成 mp4 格式视频。
1 | $ ffmpeg -allowed_extensions ALL -protocol_whitelist "file,https,tls,http,crypto,tcp" -i ./index.m3u8_backup -c copy ~/Downloads/神奇女侠1984.mp4 |
但播放 mp4 视频时,发现没有对应中文字幕。但源网站是有的,说明字幕是单独加载的,未添加到视频流中。
查找字幕请求地址
为了验证字幕是单独加载的,并获取字幕请求地址。打开开发者工具面板,Network 面板,清除所有请求。
点击视频播放器按钮,发现除了正常请求 m3u8 和 ts 地址外,还有一条请求。对这个请求做 Block request URL ,视频可以正常播放,但也没有字幕了。

字幕文件下载
正常流程
在新页面中打开字幕文件链接地址下载后,文件内容是加密的,并非正常字体文件。
字幕文件下载后解密
1 | $ npm install pako crypto-js |
文件 index.js 代码内容如下:
1 | const pako = require('pako'); |
通过调试源网站方式解密字幕文件
利用
chrome开发者工具,可以很容易找到调用此URL地址的js源码文件![步骤一]()
添加断点,获取解密后
base64编码字符串。![步骤二]()
Console面板中输入以下代码,打印base64编码字符串。在输出最后有个Copy按钮,可一键拷贝到剪贴板。1
console.log(jsdec.toString(CryptoJS.enc.Base64));
解密字幕文件。
- 将
base64编码字符串保存到tmp.txt文件 - 解密后保存至字幕文件:
./Wonder.Woman.1984.ddr.srt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15const pako = require('pako');
const fs = require("fs");
var data = fs.readFileSync("./tmp.txt", "utf-8");
var binary_string = atob(data);
var data = pako.ungzip(binary_string, {to:'string'});
fs.writeFileSync('./Wonder.Woman.1984.ddr.srt', data);
function btoa(str) {
return Buffer.from(str).toString('base64');
}
function atob(b64Encoded) {
return Buffer.from(b64Encoded, 'base64');
}- 将

生成带字幕的 mp4 视频文件
在 m3u8 转 mp4 视频时添加字幕
1 | $ ffmpeg -allowed_extensions ALL -protocol_whitelist "file,https,tls,http,crypto,tcp" -i ./index.m3u8_backup -i ~/Downloads/Wonder.Woman.1984.ddr.srt -c:s mov_text -c:v copy -c:a copy ~/Downloads/神奇女侠1984.mp4 |
为 mp4 视频添加字幕
1 | $ ffmpeg -i ~/Downloads/神奇女侠1984.mp4 -i ~/Downloads/Wonder.Woman.1984.ddr.srt -c:s mov_text -c:v copy -c:a copy ~/Downloads/神奇女侠1984-中文字幕.mp4 |

