15 Replies Latest reply on Nov 30, 2018 1:09 PM by isotropy

    SRT files in AE - a working solution -

    remco_rauwcc Level 1

      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[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 < origin.length; 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;
      }
      

       

      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.