最近在处理一个关于编辑视频字幕的项目,其中有部分逻辑值得做下记录。
1、转化 srt 所需时间格式。
function srtTimestamp(seconds) { seconds = seconds.toFixed(2); seconds = seconds - 0; let milliseconds = seconds*1000; seconds = Math.floor(milliseconds / 1000); let minutes = Math.floor(seconds / 60); let hours = Math.floor(minutes / 60); milliseconds = milliseconds % 1000; seconds = seconds % 60; minutes = minutes % 60; return (hours < 10 ? '0' : '') + hours + ':' + (minutes < 10 ? '0' : '') + minutes + ':' + (seconds < 10 ? '0' : '') + seconds + '.' + (milliseconds < 100 ? '0' : '') + (milliseconds < 10 ? '0' : '') + parseInt(milliseconds); }
2、srt 转json 数组
/ * 把 SRT 格式的字幕文件解析为字幕的对象数组,格式为: * [ * {sn: "0", startTime: 0.89, endTime: 7.89, content: "这里是一系列与Hadoop↵有关的其他开源项目:"}, * {sn: "1", startTime: 8.38, endTime: 14.85, content: "Eclipse是一个IBM贡献到开源社区里的集成开发环境(IDE)。"} * ] * * @param string srt 字幕文件的内容 * 可以将字幕双字幕保存到一个时间轴内 * @return 字幕的对象数组 */ funciton parseSrtSubtitles(srt,srt2=''){ let subtitles = []; let textSubtitles = srt.split('\n\n'); // 每条字幕的信息,包含了序号,时间,字幕内容 let textSubtitles2 = srt2 ? srt2.split('\n\n') : ''; // second for (var i = 0; i < textSubtitles.length; ++i) { var textSubtitle = textSubtitles[i].split('\n'); var textSubtitle2 = srt2 ? textSubtitles2[i].split('\n') : ''; if (textSubtitle.length >= 2) { var sn = textSubtitle[0]; // 字幕的序号 var startTime = toSeconds($.trim(textSubtitle[1].split(' --> ')[0])); // 字幕的开始时间 var endTime = toSeconds($.trim(textSubtitle[1].split(' --> ')[1])); // 字幕的结束时间 var content = textSubtitle[2]; // 字幕的内容 var content2 = srt2 ? textSubtitle2[2] : ''; // 字幕可能有多行 if (textSubtitle.length > 2) { for (var j = 3; j < textSubtitle.length; j++) { console.log(textSubtitle[j]); content += '\n' + textSubtitle[j]; } } // 字幕对象 var subtitle = { sn: sn, an:2, size:'12px', family:'serif', color:'#fff', start: startTime, end: endTime, text: content, text_yw:content2, }; subtitles.push(subtitle); } } return subtitles; }
3、将数组转化为srt 格式
/ * 把 字幕的对象数组 解析为 SRT 格式的字幕文件,格式为: * @param array 字幕的对象数组 * [ * {sn: "0", startTime: 0.89, endTime: 7.89, content: "这里是一系列与Hadoop↵有关的其他开源项目:"}, * {sn: "1", startTime: 8.38, endTime: 14.85, content: "Eclipse是一个IBM贡献到开源社区里的集成开发环境(IDE)。"} * ] * @param 标识 * en 原文 zh 译文 pb 旁白 * * @return srt 字幕文件的内容 * 1\n00:00:00,850 --> 00:00:06,440\n在斯德哥尔摩,万一哪天你中了诺贝尔奖。\n\n2\n00:00:06,740 --> 00:00:09,560\n你来这儿领奖就行。\n\n3\n00:00:11,080 --> 00:00:12,800\n皇家音乐厅。\n\n4\n00:00:13,760 --> 00:00:18,300\n该说不说的,组委会想的确实周到。\n\n" / * '1\n00:00:01.000 --> 00:00:14.010\n {\\an5}{\\fnKaiTi\\fs13} 这里是一条字幕 或旁白 '; */ funciton jsonToStr(arr,sign){ let str = ''; let key = 1; for (var i = 0; i < arr.length; ++i) { let text = ''; if(sign == 'zh'){ text = arr[i].text_yw; }else{ text = arr[i].text; } //arr[i].family = 'arial'; if(text){ str += key +'\n' + srtTimestamp(arr[i].start)+' --> ' + srtTimestamp(arr[i].end) + '\r\n{\\an'+arr[i].an+'}{\\fn'+arr[i].family+'\\fs'+pxTopt(arr[i].size)+'}'; str += '' + text +'\n\n'; //str += text +'\r\n\r\n'; key++; } } return str } //单位转化将像素px 转化为打印字体pt function pxTopt(num){ num = num ? parseInt(num) : 14; return (num-0) * (3/4); }
一条完整的数据数据
1
00:00:01.000 --> 00:00:14.010
{\an5}{\fnKaiTi\fs13}我是一条字幕
其中 an1 代表左下 以此类推 1-9 是 左下、中下、右下、左中、中心、右中、左上、中上、右上。
fn 字体family,fs 字体大小, color 颜色
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220592.html原文链接:https://javaforall.net
