ExtendScript Utilisation des compositions

<- Article précédent ExtendScript Travailler avec des fichiers





Dans les deux derniers articles, j'ai expliqué comment créer un script qui s'exécute dans After Effects. Notre script a créé une fenêtre dans l'interface du programme où nous pouvons écrire et exécuter du code ExtenScript. Mais c'est un jouet, il ne peut être utile qu'à un débutant. Faisons quelque chose de plus utile dans la vraie vie.





L'une des tâches les plus courantes que j'ai rencontrées dans mon travail était le placement dynamique des titres dans les vidéos. La vidéo est l'un des formats de contenu les plus populaires aujourd'hui. L'une des limitations imposées par le navigateur est l'incapacité de lancer le son dans la vidéo sans action de l'utilisateur. Le moyen naturel de sortir de cette situation est de remplacer le son par des titres. S'il s'agit de 5 à 10 titres, vous pouvez les créer à la main. Eh bien, que faire si vous avez besoin de publier cinq vidéos par jour et qu'elles contiennent non pas 10, mais 50 à 70 titres? De plus, chaque vidéo est de 2 à 3 formats. De plus, en plusieurs langues? Si cette situation vous semble inhabituelle, je la rencontre tous les jours.





Alors, rendons cette tâche aussi simple que possible. Nous allons créer un script plus ou moins universel qui interprétera le texte en titres dans la scène After Effects. Bien que j'aie déjà résolu ce problème à plusieurs reprises, j'écrirai mon scénario au moment de la rédaction de l'article, afin de ne rien manquer et de rendre mon histoire aussi détaillée que possible. Commençons.





Nous entrerons le texte du titre comme suit





#simple   
   simple

#simple  simple      

#double   
   double
      
      



Les titres sont séparés les uns des autres par une double césure. Les lignes d'un titre sont séparées par une césure. Le premier mot avec un caractère # est une balise qui définit le type de titre. Par cette balise, nous déterminerons par la suite la mise en page dont nous avons besoin pour créer ce titre. Mais plus à ce sujet plus tard, pour l'instant, prenez cette structure de texte pour acquis.





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









, .





<- Article précédent ExtendScript Travailler avec des fichiers








All Articles