過去2回の記事では、AfterEffectsで実行されるスクリプトの作成方法について説明しました。スクリプトは、ExtenScriptコードを記述して実行できるウィンドウをプログラムインターフェイスに作成しました。しかし、これはおもちゃであり、初心者にしか役立ちません。実生活でもっと役立つことをしましょう。
私の仕事で遭遇した最も一般的なタスクの1つは、ビデオ内のタイトルの動的な配置でした。ビデオは、今日最も人気のあるコンテンツ形式の1つです。ブラウザによって課せられる制限の1つは、ユーザーの操作なしにビデオでサウンドを起動できないことです。この状況から抜け出す自然な方法は、サウンドをタイトルに置き換えることです。 5〜10タイトルの場合は手作業で作成できます。さて、1日に5本の動画をリリースする必要があり、10本ではなく、50〜70本のタイトルが含まれている場合はどうでしょうか。さらに、各ビデオは2〜3の形式です。さらに、いくつかの言語で?この状況があなたにとって珍しいと思われる場合、私は毎日それに遭遇します。
それでは、このタスクをできるだけ簡単にしましょう。After Effectsシーンで、テキストをタイトルに解釈する多かれ少なかれ普遍的なスクリプトを作成します。私はすでに何度もこの問題を解決しましたが、何かを見逃さないように、記事を書いている時点でスクリプトを書き、ストーリーをできるだけ詳細にします。始めましょう。
タイトルテキストは次のように入力します
#simple simple #simple simple #double double
タイトルは、ダブルハイフンで区切られています。1つのタイトルの行は、ハイフネーションで区切られます。#文字の最初の単語は、タイトルのタイプを定義するタグです。このタグによって、このタイトルを作成するために必要なレイアウトを後で決定します。しかし、それについては後で詳しく説明しますが、今のところ、このテキスト構造は当然のことと考えてください。
{
(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. . .
, .