본문 바로가기

Tech-tips/After Effect

After Effect 에서 ASS / SRT 자막 불러오기

무려 3년전 이야기


트위터를 하다가 이런 트윗을 날렸다.

ASS로 타임코드 찍고 AE로 입히는 방법이 있으려나


몇 분뒤 어떤 파오후가 내게 맨션을 날렸다.

가능합니다만 #자신이만든 동영상 Url 그런데 알려드리지는 않을겁니다. 후훗


어쩌라고 병신새끼가... 지금 시비거는건가 ㅡㅡ

왜 혼모노가 욕을 먹는지 혼모노들은 스스로 생각 좀 해봤으면 ^^)




각설하고, 여기서 부터 튜토리얼.


어도비 Extended Script Editor CC를 받는다.


After effects > Files > Script > Script editor 로 들어가거나 시작메뉴에서 Extended Script Editor를 실행시킨다.


/**
    SRT subtitle import for AE CS5
    By August Bering

    Version 2

    Confirmed to work in CS5, Win7

    Usage: 
    Create a text layer in AE and select that layer. 
    Select File -> Script -> Run script... from the menu and run this script.
    In the dialog, select a .SRT subtitle file to import.
 */
function trim(s){
    return  s.replace(/^\s+|\s+$/g, '')
}
function makeSubs() {
    function getframe(timeInString){
    var t=timeInString.split(":");
    var timeS=parseInt(t)*3600+parseInt(t[1])*60+parseFloat(t[2].replace(",","."));
    var frame=timeS*app.project.activeItem.frameRate;
    return timeS;
    }
    var pb=progressBar("Creating keyframes",);
        var layer = app.project.activeItem.selectedLayers[0];

        if (layer.property("sourceText") != null) {
            var textFile = File.openDialog("Select a text file to open.", "SRT subtitles:*.srt");
            if (textFile != null) {
                var textLines = new Array();
                textFile.open("r", "TEXT", "????");

                var sourceText = layer.property("sourceText");
                var subnr=0;
                var nrSubs=0;
                while (!textFile.eof) {
                    if (""==textFile.readln())
                        nrSubs++;
                    }
                textFile.seek(0);
                //begin with empty text
                sourceText.setValueAtTime(0,"");
                while (!textFile.eof) {
                    pb.setValue(subnr/nrSubs);
//                    $.sleep(1);
                    pb.p.update();
                    if (pb.isCanceled ()){//for some reason this doesn't work at all, the window is unresponsive...
                        pb.close();
                        return;
                    }

                    subnr++;
                    var line = textFile.readln();
                        while (trim(line)=="")
                            line=textFile.readln();

                        line = textFile.readln();
                        var times=line.split('-->');
                        var starttime=getframe(times[0]);
                        var stoptime=getframe(times[1]);
//                        line= textFile.readln();
                        var text=""
                        while ((line= textFile.readln())!=""){
                            text+=line+"\r\n";
//                            line=textFile.readln()+"\n";
                          }
                        sourceText.setValueAtTime(starttime,text);// new TextDocument(text));
                        sourceText.setValueAtTime(stoptime,"");// new TextDocument(""));
                    }

                textFile.close();
                pb.close();
            }
        }
    }

/*
Easy to use progress bar for ExtendScript.
Written by poly@omino.com, 2007
Enjoy, but this credit must remain intact.

>usage:

> var pb = progressBar("main title","subtitle");
pb.setValue(valueFrom0to1);
pb.setTitle2("new subtitle display!")
if(pb.isCanceled())
pb.close(); // they clicked cancel
*/
function progressBar(title1)
{
    var result = new Object();
    result.running = true;
    result.p = new Window("palette");
    result.p.orientation = "column";
    result.p.alignChildren = "left";

    result.t1 = result.p.add("statictext",undefined,title1);
    result.b = result.p.add("progressbar");

    result.c = result.p.add("button",undefined,"Cancel");
    result.c.onClick = function() {
        this.running = false;
    }

    result.isRunning = function() { return this.running; }
    result.isCanceled = function() { return !this.isRunning(); }
    result.setValue = function(x) { this.b.value = x * 100; }
    result.setTitle1 = function(t1) { this.t1.text = t1; }
    result.close = function() { this.p.close(); }

    result.p.show();
    return result;
} 
makeSubs();


변환 스크립트를 복사해서



빈칸에 코드 붙여넣고 재생버튼 눌러서 컴파일하면 되고, 시간이 좀 걸리니 기다려야 한다.



만들어진 스크립트를 다른이름으로 저장한뒤, After effects 설치 폴더내의 script 폴더 내에 집어 넣는다.



AE 를 끄고 다시켜면 스크립트 난에 이전에 만든 스크립트가 나타난다.



새로운 텍스트 오브잭트를 만들고 시험 택스트를 적어 본 후 내용물을 비운다. empty text layer 이렇게 떠야 한다.


empty text layer를 선택한 상태에서 스크립트를 돌린다.



자막 파일 선택창이 뜨면 자막을 찾는다. 파일포맷은 SRT(Subrip)만 지원하며, 자막 파일 복사되는데에는 하루종일 걸리므로 참고 기다린다



완성된 스크립트. text 부분에서 내용수정도 가능하다.


스크립트 출처 http://scientificswede.blogspot.kr/2012/07/importing-srt-subtitles-in-after-effects.html?q=srt