ExtendScript trabajando con composiciones

<- Artículo anterior ExtendScript Trabajar con archivos





En los dos últimos artículos, he explicado cómo crear un script que se ejecute en After Effects. Nuestro script creó una ventana en la interfaz del programa donde podemos escribir y ejecutar código ExtenScript. Pero este es un juguete, solo puede ser útil para un principiante. Hagamos algo más útil en la vida real.





Una de las tareas más comunes que encontré en mi trabajo fue la ubicación dinámica de títulos en videos. El video es uno de los formatos de contenido más populares en la actualidad. Una de las limitaciones impuestas por el navegador es la imposibilidad de lanzar sonido en el video sin la acción del usuario. La forma natural de salir de esta situación es reemplazar el sonido con títulos. Si se trata de 5 a 10 títulos, puede hacerlos a mano. Bueno, ¿qué pasa si necesita lanzar cinco videos al día y no contienen 10, sino 50 - 70 títulos? Además, cada video está en 2-3 formatos. Además, ¿en varios idiomas? Si esta situación le parece inusual, la encuentro todos los días.





Así que hagamos esta tarea lo más fácil posible. Haremos un guión más o menos universal que interpretará el texto en títulos en la escena de After Effects. Aunque ya he resuelto este problema muchas veces, escribiré mi guión justo en el momento de escribir el artículo, para no perderme nada y hacer mi historia lo más detallada posible. Empecemos.





Ingresaremos el texto del título de la siguiente manera





#simple   
   simple

#simple  simple      

#double   
   double
      
      



Los títulos están separados entre sí por doble guion. Las líneas de un título están separadas por guiones. La primera palabra con un carácter # es una etiqueta que define el tipo de título. Mediante esta etiqueta, determinaremos posteriormente qué diseño necesitamos para crear este título. Pero más sobre eso más adelante, por ahora, dé por sentada esta estructura de texto.





. . , 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. . .









, .





<- Artículo anterior ExtendScript Trabajar con archivos








All Articles