Skip to main content
Participating Frequently
April 26, 2018
Question

SRT files in AE - a working solution -

  • April 26, 2018
  • 11 replies
  • 37665 views

THE ISSUE:

For a while now I've been seaching for an easy way to add subtitles to my After Effects files. I know there are a few different ways to use free and/or paid extendscripts but the ones I've found all ended up with having hard-coded keyframes. When you've made some manual changes to your subs in AE and there were some last-minute changes to your subs you either had to manually do the corrections, or re-run the script with the new sub and re-do all you manual (formatting) changes.

Wouldn't it be ideal if you could just import/link the SRT file into your library like you would with other kinds of footage?

THE ANSWER:

you can!

Since the CC2018 version of AE you can import JSON files to create data driven animations. Well, isn't a JSON file basically just text? So this got me thinking; "what if I tried importing a SRT file instead of JSON?". As it turns out, if you omit the file mask in the import file dialog (All files (*.*)), you can in fact import *.srt files. Using

footage("filename.srt").sourceText

as an expression on a textLayer's Source Text if showed the (complete) contents of the SRT file. All I had to do now is parse the contents, get the in-time, out-time and the actual sub and have it all displayed at the right time. Mind you, I'm not a programmer so there might be a better, more efficient, prettier looking solution than this, but here's my working solution:

var subFile = "sub.srt";

var lines = footage(subFile).sourceText.split('\n\r\n');

for (n = 0; n < lines.length; n++) {

if (time >= srt(lines, n).start && time < srt(lines, n).end) {

sourceText = srt(lines, n).sub;

break;

} else {

sourceText = "";

}

}

//------------------------------------

function srt(lines, i) {

origin = lines.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 < origin.length; j++) {

subtitle = subtitle + origin + '\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;

}

You simply place the above expression in the Source Text property of a TextLayer and replace "sub.srt" with the name of your imported subtitle file.

11 replies

Participant
June 8, 2018

I'm trying to replicate your solution above. Could you please elaborate on "if you omit the file mask in the import file dialog (All files (*.*)), you can in fact import *.srt files."? I'm stuck on that step.

Thanks in advanced!

Participating Frequently
June 15, 2018

Apologies for the late reply.

If you have the Import FIle window open, you see "All acceptable files" in the lower right corner. This masks the files in the folder to only files that AE is sure of that can be opened. If you click on that and scroll all the way down you can choose "All files (*.*)". When you do that AE shows you all the files in the folder, like for instance .srt files.

Hope that helps!

Participant
June 19, 2018

Yes, this works, but after that you have to point out in a dropdown menu what kind of file you are importing. What kind do you use?