自CC2018版本的AE以来,您可以导入JSON文件以创建数据驱动的动画。那么,JSON文件基本上只是文本吗?所以这让我思考; “如果我尝试导入SRT文件而不是JSON会怎样?” 事实证明,如果在导入文件对话框中省略文件掩码(所有文件(*。*)),您实际上可以导入* .srt文件。运用 footage(“filename.srt”).sourceText
如果显示SRT文件的(完整)内容,则作为textLayer的源文本上的表达式。我现在要做的就是解析内容,获取及时,出时和实际的子,并在正确的时间显示所有内容。请注意,我不是程序员,所以可能有一个比这更好,更有效,更漂亮的解决方案,但这是我的工作解决方案: var subFile = “sub.srt”; var lines = footage(subFile).sourceText.split(‘\n\r\n’); for (n = 0; n if (time >= srt(lines, n).start && time sourceText = srt(lines, n).sub; break; } else { sourceText = “”; } } //———————————— function srt(lines, i) { origin = lines[i].split(‘\n’); ID = parseInt(origin[0]); startText = origin[1].match(/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]/)[0].replace(“,”, “:”); endText = origin[1].match(/\s[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]/)[0].replace(‘ ‘, ”).replace(“,”, “:”); var subtitle = “”; for (var j = 2; j subtitle = subtitle + origin[j] + ‘\n’; } return {id:ID, start:parseTime(startText), end:parseTime(endText), sub:subtitle}; } //———————————— function parseTime(str) { hours = parseInt(str.split(‘:’)[0]); minutes = parseInt(str.split(‘:’)[1]); seconds = parseInt(str.split(‘:’)[2]); millisesconds = parseInt(str.split(‘:’)[3]); t = (hours*60*60) + (minutes*60) + seconds + (millisesconds/1000); t = Math.round(t*100)/100; return t; }
您只需将上面的表达式放在TextLayer的Source Text属性中,并将“sub.srt”替换为导入的字幕文件的名称。
|