在将 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 |