ExtendScript Arbeiten mit Kompositionen

<- Vorheriger Artikel ExtendScript Arbeiten mit Dateien





In den letzten beiden Artikeln habe ich beschrieben, wie Sie ein Skript erstellen, das in After Effects ausgeführt wird. Unser Skript hat ein Fenster in der Programmoberfläche erstellt, in dem wir ExtenScript-Code schreiben und ausführen können. Aber dies ist ein Spielzeug, es kann nur für einen Anfänger nützlich sein. Lassen Sie uns etwas Nützlicheres im wirklichen Leben tun.





Eine der häufigsten Aufgaben bei meiner Arbeit war die dynamische Platzierung von Titeln in Videos. Video ist heute eines der beliebtesten Inhaltsformate. Eine der vom Browser auferlegten Einschränkungen ist die Unfähigkeit, Ton im Video ohne Benutzeraktion zu starten. Der natürliche Ausweg aus dieser Situation besteht darin, den Sound durch Titel zu ersetzen. Wenn es sich um 5 - 10 Titel handelt, können Sie diese von Hand erstellen. Was ist, wenn Sie fünf Videos pro Tag veröffentlichen müssen und diese nicht 10, sondern 50 - 70 Titel enthalten? Darüber hinaus ist jedes Video in 2 - 3 Formaten. Plus, in mehreren Sprachen? Wenn Ihnen diese Situation ungewöhnlich erscheint, begegne ich ihr jeden Tag.





Machen wir diese Aufgabe so einfach wie möglich. Wir werden ein mehr oder weniger universelles Skript erstellen, das den Text in Titel in der After Effects-Szene interpretiert. Obwohl ich dieses Problem bereits viele Male gelöst habe, werde ich mein Skript direkt zum Zeitpunkt des Schreibens des Artikels schreiben, um nichts zu verpassen und meine Geschichte so detailliert wie möglich zu gestalten. Lass uns anfangen.





Wir werden den Titeltext wie folgt eingeben





#simple   
   simple

#simple  simple      

#double   
   double
      
      



Titel werden durch doppelte Silbentrennung voneinander getrennt. Zeilen eines Titels werden durch Silbentrennung getrennt. Das erste Wort mit einem # -Zeichen ist ein Tag, das den Titel definiert. Anhand dieses Tags bestimmen wir anschließend, welches Layout wir zum Erstellen dieses Titels benötigen. Aber dazu später mehr, nehmen Sie diese Textstruktur vorerst als selbstverständlich an.





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









, .





<- Vorheriger Artikel ExtendScript Arbeiten mit Dateien








All Articles