ExtendScript trabalhando com composições

<- Artigo anterior ExtendScript Trabalhando com arquivos





Nos últimos dois artigos, falei sobre como fazer um script que seja executado no After Effects. Nosso script criou uma janela na interface do programa onde podemos escrever e executar o código ExtenScript. Mas este é um brinquedo, só pode ser útil para um iniciante. Vamos fazer algo mais útil na vida real.





Uma das tarefas mais comuns que encontrei em meu trabalho foi a colocação dinâmica de títulos em vídeos. O vídeo é um dos formatos de conteúdo mais populares hoje. Uma das limitações impostas pelo navegador é a incapacidade de iniciar o som no vídeo sem a ação do usuário. A maneira natural de sair dessa situação é substituir o som por títulos. Se forem de 5 a 10 títulos, você poderá criá-los manualmente. Bem, e se você precisar lançar cinco vídeos por dia e eles não contiverem 10, mas de 50 a 70 títulos? Além disso, cada vídeo está em 2 - 3 formatos. Além disso, em vários idiomas? Se esta situação parece incomum para você, então eu a encontro todos os dias.





Portanto, vamos tornar essa tarefa o mais fácil possível. Faremos um script mais ou menos universal que interpretará o texto em títulos na cena do After Effects. Embora já tenha resolvido esse problema muitas vezes, vou escrever meu roteiro logo na hora de escrever o artigo, para não perder nada e tornar minha história o mais detalhada possível. Vamos começar.





Vamos inserir o texto do título da seguinte maneira





#simple   
   simple

#simple  simple      

#double   
   double
      
      



Os títulos são separados uns dos outros por dupla hifenização. As linhas de um título são separadas por hifenização. A primeira palavra com um caractere # é uma tag que define o tipo de título. Por meio dessa tag, determinaremos subsequentemente qual layout precisamos para criar este título. Mas mais sobre isso mais tarde, por enquanto, considere essa estrutura de texto garantida.





. . , init, , .





{
(function init(){
   
//       

})();
}
      
      







var editText = win.add(
   'edittext',
   [0, 0, 300, 300],
   '  ',
   {multiline: true}
);
      
      



run , createTitres





btnRun.onClick = function () {
   try {
       createTitres(editText.text.getTitresData());
   } catch (err) {
       alert(err)
   }
};
      
      



createTitres, .





function createTitres(data) {

}
      
      



String, getTitresData, , . Array, map. .





String.prototype.getTitresData = function() {
   return this
       .replace(/(^\n|^ |^"|\n+$| +$|"+$)/g, "")
       .split("\n\n")
       .map(function(d) {
           var str = d.replace(/(^\n|^ |\n+$| +$)/g, "")
           var tag = str.split(" ")[0];
           var text = str.replace(tag + ' ', '');
           return {
               type: tag.replace('#', ''),
               text: text,
           }
       });
}
Array.prototype.map = function(callback) {
   var arr = [];
   for (var i = 0; i < this.length; i++) {
       arr.push(callback(this[i]));
   }
   return arr;
}
      
      



, . getTitresData . , , , , .





this.replace(/(^\n|^ |^"|\n+$| +$|"+$)/g, "")
      
      







.split("\n\n")
      
      



,





.map(function(d) {
  var str = d.replace(/(^\n|^ |^"|\n+$| +$|"+$)/g, "")
  var tag = str.split(" ")[0];
  var text = str.replace(tag + ' ', '');
  return {
    type: tag.replace('#', ''),
    text: text,
  }
});
      
      



. createTitres . . .





. After Effects. . Project   , 1x1. ModelScene_1x1





ModelScene , ,   . 1x1 , . , , . .





.





, , , . Duration , . .





. . createTitres .





function createTitres(data) {
   var scenesData = getScenesData();
}

function getScenesData() {
   var doc = app.project;
   var data = [];
   for (var i = 1; i <= doc.numItems; i++) {
       var item = doc.item(i);

       if (item instanceof CompItem &&
           /^ModelScene/.test(item.name)) {
           data.push({
               type: item.name.split('_')[1],
               width: item.width,
               height: item.height,
               frameRate: Math.floor(1 / item.frameDuration),
               duration: item.duration
           });
       }
   }
   return data;
}
      
      



getScenesData . , . numItems.





for (var i = 1; i <= doc.numItems; i++)
      
      



, ModelScene.





if (item instanceof CompItem &&
    /^ModelScene/.test(item.name))
      
      



, .





data.push({
    type: item.name.split('_')[1],
    width: item.width,
    height: item.height,
    frameRate: Math.floor(1 / item.frameDuration),
    duration: item.duration
});
      
      



, . , , . frameDuration - .





, , , .





function createTitres(data) {
   var scenesData = getScenesData();

   for(var i = 0; i < scenesData.length; i++) {
       var scene = getScene(scenesData[i]);
   }
}

function getScene(data) {
   var sceneName = 'scene-' + data.type;
   return getItem(sceneName, CompItem) ||
       app.project.items.addComp(
           sceneName,
           data.width,
           data.height,
           1,
           data.duration,
           data.frameRate
       );
}

function getItem(name, type) {
   var doc = app.project;

   for (var i = 1; i <= doc.numItems; i++) {
       if (doc.item(i).name === name) {
           if (type) {
               if (doc.item(i) instanceof type) {
                   return doc.item(i);
               }
           } else {
               return doc.item(i);
           }
       }
   }
   return null;
}
      
      



getScene





getItem(sceneName, CompItem)
      
      



, ,





app.project.items.addComp(
    sceneName,
    data.width,
    data.height,
    1,
    data.duration,
    data.frameRate
);
      
      



. , scene-1x1. . .









, .





<- Artigo anterior ExtendScript Trabalhando com arquivos








All Articles