Files
fast-srt-subtitle/sketch.js

112 lines
2.9 KiB
JavaScript
Raw Normal View History

2019-12-13 15:56:36 +08:00
let curr; // current time
let sta; // status text
let status; // = select("#status");
let tAreaText; //
let tArea;
let vidFile = "./video.mp4";
let subFile = "./subs.txt";
let subText; // load from text file
let lineStartTime = [];
let lineEndTime = [];
let reactTime = 0.4;
let currentStamping = 0;
let srt = "";
function preload() {
vid = createVideo(vidFile);
vid.size(640, 320);
subText = loadStrings(subFile);
}
function setup() {
noCanvas();
status = select("#status");
tArea = select("#textArea");
for (let i = 0; i < subText.length; i++) {
lineStartTime[i] = null;
lineEndTime[i] = null;
//init all timestamps to 0
}
lineStartTime[0] = 0;
}
function draw() {
curr = vid.elt.currentTime;
sta = `Stamping Line ${currentStamping} | Playhead: ${curr}`;
tAreaText = "";
2019-12-31 16:33:23 +08:00
for (let i = 0; i < 5; i++) {
2019-12-13 15:56:36 +08:00
if (i == 0) {
tAreaText += "** 目前 ---> "
}
tAreaText += `${subText[currentStamping+i]} | ${lineStartTime[currentStamping+i]} --> ${lineEndTime[currentStamping+i]}` + String.fromCharCode(13, 10);
}
status.html(sta);
tArea.html(tAreaText);
}
function keyPressed() {
if (keyCode === 75) { // K
// 按左鍵
// set line start time to current time
lineStartTime[currentStamping + 1] = vid.elt.currentTime - reactTime;
if (lineStartTime[currentStamping + 1] < 0){
lineStartTime[currentStamping + 1] = 0;
}
// set prev line's end time, if prev end time > currentTime;
if (lineEndTime[currentStamping] > vid.elt.currentTime - reactTime || lineEndTime[currentStamping] == null) {
lineEndTime[currentStamping] = vid.elt.currentTime - 0.03 - reactTime;
if (lineEndTime[currentStamping] < 0){
lineEndTime[currentStamping] = 0;
}
}
currentStamping++;
} else if (keyCode === 76) { // L
lineEndTime[currentStamping] = vid.elt.currentTime - reactTime;
} else if (keyCode === 73) { // I
currentStamping--;
} else if (keyCode === 79) { // O
currentStamping++;
} else if (keyCode === 81) {
// Q : Make SRT
makeSRT();
2019-12-31 16:33:23 +08:00
} else if (keyCode === 85) { // U
vid.elt.currentTime -= 5;
} else if (keyCode === 80) { // P
vid.elt.currentTime += 5
2019-12-13 15:56:36 +08:00
}
}
function makeSRT() {
srt = "";
for (let i = 0; i < subText.length; i++) {
// line number
srt += (i + 1) + "\n";
// line time
let sh, sm, ss, sms;
let eh, em, es, ems;
sh = floor(lineStartTime[i] / 3600);
sm = floor((lineStartTime[i] % 3600) / 60);
ss = floor(lineStartTime[i] % 60);
sms = floor((lineStartTime[i] * 1000) % 1000);
eh = floor(lineEndTime[i] / 3600);
em = floor((lineEndTime[i] % 3600) / 60);
es = floor(lineEndTime[i] % 60);
ems = floor((lineEndTime[i] * 1000) % 1000);
srt += `${sh}:${sm}:${ss},${sms} --> ${eh}:${em}:${es},${ems}\n`
srt += subText[i];
srt += "\n\n"
}
console.log(srt);
let blob = new Blob([srt], {
type: "text/plain;charset=utf-8"
});
saveAs(blob, 'srt.txt');
}