0%

ddrk之字幕处理

在将 m3u8ts 等文件下载完毕后,通过以下命令转换成 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 面板,清除所有请求。

点击视频播放器按钮,发现除了正常请求 m3u8ts 地址外,还有一条请求。对这个请求做 Block request URL ,视频可以正常播放,但也没有字幕了。

image-20210110130837775

字幕文件下载

正常流程

在新页面中打开字幕文件链接地址下载后,文件内容是加密的,并非正常字体文件。

字幕文件下载后解密
1
2
$ npm install pako crypto-js
$ node index.js

文件 index.js 代码内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const pako = require('pako');
const fs = require("fs");
const CryptoJS = require("crypto-js");

//var eAB = fs.readFileSync("./Wonder.Woman.1984.ddr", "utf-8");
var eAB = fs.readFileSync("./Wonder.Woman.1984.ddr");

let wordArray = CryptoJS.lib.WordArray.create(eAB.slice(16));
let hexStr = Array.prototype.map.call(new Uint8Array(eAB.slice(0, 16)), x => ('00' + x.toString(16)).slice(-2)).join('');
let wordArray2 = CryptoJS.enc.Hex.parse(hexStr);

let jsdec = CryptoJS.AES.decrypt({ciphertext:wordArray},wordArray2,{
iv: wordArray2,
mode: CryptoJS.mode.CBC
});

//var binary_string = atob(jsdec.toString(CryptoJS.enc.Base64)).toString();
//let len = binary_string.length;
//let bytes = new Uint8Array(len);
//for (let i = 0; i < len; i++) {
// bytes[i] = binary_string.charCodeAt(i);
//}
//var data = pako.ungzip(bytes.buffer, {to:'string'});

var binary_string = atob(jsdec.toString(CryptoJS.enc.Base64));
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');
}

通过调试源网站方式解密字幕文件

  1. 利用 chrome 开发者工具,可以很容易找到调用此URL地址的 js 源码文件

    步骤一

  2. 添加断点,获取解密后 base64 编码字符串。

    步骤二

  1. Console 面板中输入以下代码,打印 base64 编码字符串。在输出最后有个 Copy 按钮,可一键拷贝到剪贴板。

    1
    console.log(jsdec.toString(CryptoJS.enc.Base64));
  2. 解密字幕文件。

    • base64 编码字符串保存到 tmp.txt 文件
    • 解密后保存至字幕文件: ./Wonder.Woman.1984.ddr.srt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const 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');
    }

image-20210110133016367

生成带字幕的 mp4 视频文件

m3u8mp4 视频时添加字幕
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

参考