ExtendScript Bekerja dengan Komposisi

<- Artikel sebelumnya ExtendScript Bekerja dengan file





Dalam dua artikel terakhir, saya telah membahas cara membuat skrip yang berjalan di After Effects. Skrip kami membuat jendela di antarmuka program tempat kami dapat menulis dan menjalankan kode ExtenScript. Tapi ini mainan, ini hanya berguna untuk pemula. Mari lakukan sesuatu yang lebih bermanfaat dalam kehidupan nyata.





Salah satu tugas paling umum yang saya temui dalam pekerjaan saya adalah penempatan dinamis judul dalam video. Video adalah salah satu format konten paling populer saat ini. Salah satu batasan yang diberlakukan oleh browser adalah ketidakmampuan untuk meluncurkan suara dalam video tanpa tindakan pengguna. Jalan keluar alami dari situasi ini adalah mengganti suara dengan judul. Jika 5 - 10 judul, maka Anda dapat membuatnya dengan tangan. Nah, bagaimana jika Anda perlu merilis lima video sehari dan itu tidak berisi 10, tetapi 50-70 judul? Apalagi setiap video dalam 2 - 3 format. Plus, dalam beberapa bahasa? Jika situasi ini tampak tidak biasa bagi Anda, maka saya mengalaminya setiap hari.





Jadi, mari buat tugas ini semudah mungkin. Kami akan membuat skrip yang kurang lebih universal yang akan menafsirkan teks menjadi judul di adegan After Effects. Meskipun saya sudah berkali-kali memecahkan masalah ini, saya akan menulis naskah saya tepat pada saat menulis artikel, agar tidak ketinggalan apa pun dan membuat cerita saya sedetail mungkin. Mari kita mulai.





Kami akan memasukkan teks judul sebagai berikut





#simple   
   simple

#simple  simple      

#double   
   double
      
      



Judul dipisahkan satu sama lain dengan tanda hubung ganda. Baris satu judul dipisahkan dengan tanda hubung. Kata pertama dengan karakter # adalah tag yang mendefinisikan jenis judul. Dengan tag ini, selanjutnya kita akan menentukan layout apa yang kita perlukan untuk membuat judul ini. Tetapi lebih dari itu nanti, untuk saat ini, anggaplah struktur teks ini begitu saja.





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









, .





<- Artikel sebelumnya ExtendScript Bekerja dengan file








All Articles