AEスクリプトで自分だけのレンダー設定ツールをつくって効率化する!
- 2014/10/12
あなたがもしAfter Effectsを毎日使うようなAEユーザーなら、ぜひAEスクリプトを書くべきです。スクリプトとは簡単なプログラムのことですが、これによりコンポジット作業はずっと素晴らしいものになります。何度も同じボタンを押すような面倒な仕事はコンピューターに任せて、クリエイティブで楽しい作業に集中できるようになるのです。
AEスクリプトは有名なJavaScriptがベースになっているので、学習するための情報はウェブ上にたくさんあります。しかし、「プログラムなんて分からない」と敬遠するユーザーも多いかもしれません。そこで今回は、AEスクリプトを書いたことのない方に向けて、初歩的なところから説明したいと思います。そして、自分専用の実用的な「レンダー設定ツール」の作り方を覚えながら、素晴らしきAEスクリプトの世界を知っていただければと思います!
まずはAEスクリプトの基本的な書き方、使い方を説明します。私と一緒に、有名な「Hello world」というプログラムをつくってみましょう。これは画面に「Hello world」というメッセージが表示されるだけのシンプルなプログラムです。
1. スタートメニューから、「Adobe ExtendScript Toolkit」というソフトを起動します。このエディターでコードを書きます。それから、After Effectsも裏で起動しておいてください。
2. ExtendScript Toolkitが起動したら、上の方にあるドロップダウンから「After Effects」を選択します。
3. コードを書きます。alert();という決まった書き方を使います。
コード:
文字列は通常、 "(ダブルクォーテーション)で囲みます。また、文末では;(セミコロン)を書きます。
4. 再生ボタンをクリックして、スクリプトを実行します。
5. After Effects上で「Hello world」というメッセージウィンドウが表示されたと思います。うまくいきましたか?
6. スクリプトをファイルに保存しましょう。
Hello world.jsx という名前で、以下のScriptsフォルダに保存してください。
(例・CS6の場合)
C:\Program Files\Adobe\Adobe After Effects CS6\Support Files\Scripts
7. After Effectsを再起動してください。After Effectsの[ファイル]メニュー>[スクリプト]の中に Hello world.jsx が表示されるはずです。これで、After EffectsでいつでもHello worldを実行できるようになりました!
ね、簡単でしょう?
では、もっと実用的なスクリプト、レンダー設定ツールを作りたいと思います。こんなツールです。「コンポを1つ選択してスクリプトを実行すると、そのコンポをレンダーキューに追加し、レンダリング設定を[現在の設定]、出力モジュールを[ロスレス圧縮(アルファ付き)]に設定し、保存先を[D:\Render\コンポ名]に設定する」。(※事前にDドライブにRenderというフォルダを手動で作成しておく必要はあります)
できました!(※「//~」の部分はコメントで、プログラムとしては実行されません)
コード:
「var ○○=××;」という記述が出てきますが、これは変数の宣言を行っています。変数というのは「自分で決めるキーワード」のようなもので、データを入れることができます。たとえば、最初に変数「myComp」を宣言していますが、これで何度も「app.project.activeItem」と書かなくても、myCompと書けば同じことになるわけです。便利です!
逆に言えば、変数以外の記述のほとんどは決まった書き方になります。たとえばapp.project.activeItemは、アクティブアイテムと言って、「After Effectsのプロジェクトパネルの中で1つだけ選択されているアイテム」を指すAEスクリプトの書き方です(※ただし、タイムラインパネルなどがアクティブな場合は、そちらのコンポがアクティブアイテムになります)。
ところで、このスクリプトには大きな欠陥があります。アクティブアイテムはコンポとは限らず、フォルダやフッテージかもしれません。ユーザーがうっかりフォルダを選択してスクリプトを実行した場合、エラーで止まってしまいます。また、何も選択せずに実行した場合や、複数のアイテムを選択していた場合、アクティブアイテムは「null」(=ない)というデータで帰ってくるので、やはりエラーになってしまうのです。
では、エラー対策をしてみましょう。「コンポを1つ選択しているときだけ処理を実行し、そうでなければメッセージが出る」というふうに改良してみます。if文という書き方を使ってみたいと思います。
できました!
コード:
今回使ったのはif~else~という条件分岐の構文です。条件に応じて実行するコードを切り替えることができるのですが、とても便利なのでよく使われます。以下のように書きます。
if ( 条件 ) { 条件にあてはまったときの処理 }
else { 条件にあてはまらないときの処理 }
なお、「myComp != null」で、myComp(アクティブアイテム)がnullではなくちゃんと存在する状態を指します。「!=」は否定を意味します。また、「myComp instanceof CompItem」はmyCompがコンポジションだという状態を指します。この2つを「&&」でつなげて、「かつ」という意味にしています。
これで、間違った状態でスクリプトを実行したときは、ちゃんと注意してくれるようになりました!このツール頭いいですね!
もっと便利なツールに改良しましょう。今のままでは「複数のコンポをキューに追加する」ということができません。app.project.activeItem(アクティブアイテム)という書き方を使うのは、やっぱりやめましょう。代わりにapp.project.selectionというのを使ってみたいと思います。これは、「After Effectsのプロジェクトパネルで選択しているアイテム群」を意味するAEスクリプトの書き方です。
app.project.selectionについては、ちょっと注意して欲しいことがあります。これは配列と呼ばれるのですが、複数のアイテムが入った集合体のデータになります。app.project.selection[0]とか、app.project.selection[1]と書くことで、1つ1つのアイテムを取り出すことができます。これは0から数え始めます(配列は基本的には0から数え始めますが、AEスクリプトでは1から数え始める場合もあります)。また、配列.length という書き方をすると、その配列に含まれているデータの個数が分かります。
この配列を利用して、複数のコンポに対応させたいと思います。また、ここでは配列とは切っても切り離せないfor文という書き方を利用することになります。
できました!
コード:
今回は少し複雑なことをしています。まずは「現在選択しているコンポ群」というデータを手に入れる必要があります。そこで最初に var myComps = new Array(); と書いて、自分で新しくmyCompsという名前の配列のデータをつくりました。もっとも、この段階ではmyCompsの中身は空っぽです。ここに選択中のコンポをつめこもうというわけです。
次に、 var selItem = app.project.selection; と書いて、選択中のアイテムの配列を取得しています。しかし、このデータに含まれているのはコンポかもしれませんし、フォルダやフッテージかもしれません。とにかく「選択しているアイテム」です。そこで、ここからコンポだけを取り出してmyCompsの方に移してやりたいと思います。そこで必要になってくるのがfor文です。
for(var i = 0; i < ○○.length; i++) { } というのは繰り返しの構文です。i=0からスタートして、iを1つずつ大きな数字にしながら、○○の数になる前まで繰り返します。ほぼ決まった書き方なので、そういうものだと思ってください。ここでは、選択中のアイテムを1つずつ見ていって、コンポだったらmyCompsに加えるということをしています。配列.push(アイテム)というJavaScriptの書き方を使い、配列にコンポを加えています。
このようにしてmyCompsの中に「現在選択しているコンポ群」を入れることができました。ここまで来れば、後は簡単です。今度はこのmyCompsをfor文で繰り返し処理して、レンダーキューに追加するだけです。このようにして、複数コンポに対応することができました。このツールかなり頭いいですね!でも、もっともっと自動化しましょう!
私はもう、コンポを選択することすら面倒になってきました。「コンポの名前に"Render"という文字列が含まれていたらレンダーキューに追加する」というツールにしましょう。
できました!前半を少しアレンジしただけです。
コード:
今回はapp.project.itemsという書き方をしています。これは「After Effectsのプロジェクトパネルにあるすべてのアイテム群」を意味します。これも配列のデータなので、app.project.items(1)というふうに書いて、1つ1つを取り出すことができます。この場合は1から数えはじめます。
"Render"という文字列がコンポ名に含まれているかチェックするのに、indexOf(文字)というJavaScriptの書き方を使いました。指定した文字列を含まなかった場合に「-1」というデータを返してくるので、今回はそれを利用して、"Render"があるか判別しています。このツール超頭いい!
本格的なスクリプトでは、数百行、数千行のコードを書くこともあります。今回のスクリプトはたった20行程度です。それでも、十分に実用的ではないでしょうか?もちろん、このツールはまだまだ改良できます。
◆連番ファイル(シーケンスファイル)に対応させてみてはどうでしょうか?出力先に "_[####]" という文字列を追加すれば、連番ファイルをレンダーすることもできます。
◆コンポ名のままレンダーするのではなく、「コンポ名に文字列を追加した名前」にしてレンダーすることも可能です。逆に、「コンポ名から文字列を削った名前」にすることもできます。
◆日付を加えた名前でレンダーしてみるのはどうでしょうか?コンピューターから日付の情報を取得することもできます。
◆保存先をD:\Renderフォルダにするのではなく、さらにその中に新しいフォルダを作成するのはどうでしょうか?AEスクリプトから、ディレクトリに新しいフォルダを作成することも可能です。
◆今回はコンポ名を利用しましたが、コンポ名だけでなく現在開いているaepファイルの名前を利用することもできます。「app.project.file.name」と書けば、aepファイル名を取得できます。また、aepファイルが保存されているパスも取得できます。これは出力先に利用できるかもしれません。
ぜひ、自分専用にカスタマイズしてみてください。書き方を知れば、できることがどんどん広がります。AEスクリプトを楽しんでみてください!
AEスクリプトは有名なJavaScriptがベースになっているので、学習するための情報はウェブ上にたくさんあります。しかし、「プログラムなんて分からない」と敬遠するユーザーも多いかもしれません。そこで今回は、AEスクリプトを書いたことのない方に向けて、初歩的なところから説明したいと思います。そして、自分専用の実用的な「レンダー設定ツール」の作り方を覚えながら、素晴らしきAEスクリプトの世界を知っていただければと思います!
AEスクリプトの基本的な書き方、使い方
まずはAEスクリプトの基本的な書き方、使い方を説明します。私と一緒に、有名な「Hello world」というプログラムをつくってみましょう。これは画面に「Hello world」というメッセージが表示されるだけのシンプルなプログラムです。
1. スタートメニューから、「Adobe ExtendScript Toolkit」というソフトを起動します。このエディターでコードを書きます。それから、After Effectsも裏で起動しておいてください。
2. ExtendScript Toolkitが起動したら、上の方にあるドロップダウンから「After Effects」を選択します。
3. コードを書きます。alert();という決まった書き方を使います。
コード:
alert("Hello world");
文字列は通常、 "(ダブルクォーテーション)で囲みます。また、文末では;(セミコロン)を書きます。
4. 再生ボタンをクリックして、スクリプトを実行します。
5. After Effects上で「Hello world」というメッセージウィンドウが表示されたと思います。うまくいきましたか?
6. スクリプトをファイルに保存しましょう。
Hello world.jsx という名前で、以下のScriptsフォルダに保存してください。
(例・CS6の場合)
C:\Program Files\Adobe\Adobe After Effects CS6\Support Files\Scripts
7. After Effectsを再起動してください。After Effectsの[ファイル]メニュー>[スクリプト]の中に Hello world.jsx が表示されるはずです。これで、After EffectsでいつでもHello worldを実行できるようになりました!
ね、簡単でしょう?
レンダー設定ツールをつくる!
では、もっと実用的なスクリプト、レンダー設定ツールを作りたいと思います。こんなツールです。「コンポを1つ選択してスクリプトを実行すると、そのコンポをレンダーキューに追加し、レンダリング設定を[現在の設定]、出力モジュールを[ロスレス圧縮(アルファ付き)]に設定し、保存先を[D:\Render\コンポ名]に設定する」。(※事前にDドライブにRenderというフォルダを手動で作成しておく必要はあります)
できました!(※「//~」の部分はコメントで、プログラムとしては実行されません)
コード:
//1つだけ選択されているアイテムをmyCompとする
var myComp = app.project.activeItem;
var RQ = app.project.renderQueue.items.add(myComp); //キュー追加
RQ.applyTemplate("現在の設定"); //レンダリング設定
var OM = RQ.outputModule(1);
OM.applyTemplate("ロスレス圧縮(アルファ付き)"); //出力モジュール
OM.file = new File("D:/Render/" + myComp.name); //出力先
「var ○○=××;」という記述が出てきますが、これは変数の宣言を行っています。変数というのは「自分で決めるキーワード」のようなもので、データを入れることができます。たとえば、最初に変数「myComp」を宣言していますが、これで何度も「app.project.activeItem」と書かなくても、myCompと書けば同じことになるわけです。便利です!
逆に言えば、変数以外の記述のほとんどは決まった書き方になります。たとえばapp.project.activeItemは、アクティブアイテムと言って、「After Effectsのプロジェクトパネルの中で1つだけ選択されているアイテム」を指すAEスクリプトの書き方です(※ただし、タイムラインパネルなどがアクティブな場合は、そちらのコンポがアクティブアイテムになります)。
ところで、このスクリプトには大きな欠陥があります。アクティブアイテムはコンポとは限らず、フォルダやフッテージかもしれません。ユーザーがうっかりフォルダを選択してスクリプトを実行した場合、エラーで止まってしまいます。また、何も選択せずに実行した場合や、複数のアイテムを選択していた場合、アクティブアイテムは「null」(=ない)というデータで帰ってくるので、やはりエラーになってしまうのです。
では、エラー対策をしてみましょう。「コンポを1つ選択しているときだけ処理を実行し、そうでなければメッセージが出る」というふうに改良してみます。if文という書き方を使ってみたいと思います。
できました!
コード:
//1つだけ選択されているアイテムをmyCompとする
var myComp = app.project.activeItem;
//myCompがnullではなく、かつコンポならば処理する
if ((myComp != null) && (myComp instanceof CompItem)) {
var RQ = app.project.renderQueue.items.add(myComp);
RQ.applyTemplate("現在の設定");
var OM = RQ.outputModule(1);
OM.applyTemplate("ロスレス圧縮(アルファ付き)");
OM.file = new File("D:/Render/" + myComp.name );
}
else{
alert("コンポを1つ選択して実行してください。");
}
今回使ったのはif~else~という条件分岐の構文です。条件に応じて実行するコードを切り替えることができるのですが、とても便利なのでよく使われます。以下のように書きます。
if ( 条件 ) { 条件にあてはまったときの処理 }
else { 条件にあてはまらないときの処理 }
なお、「myComp != null」で、myComp(アクティブアイテム)がnullではなくちゃんと存在する状態を指します。「!=」は否定を意味します。また、「myComp instanceof CompItem」はmyCompがコンポジションだという状態を指します。この2つを「&&」でつなげて、「かつ」という意味にしています。
これで、間違った状態でスクリプトを実行したときは、ちゃんと注意してくれるようになりました!このツール頭いいですね!
複数コンポに対応したレンダー設定ツールをつくる!
もっと便利なツールに改良しましょう。今のままでは「複数のコンポをキューに追加する」ということができません。app.project.activeItem(アクティブアイテム)という書き方を使うのは、やっぱりやめましょう。代わりにapp.project.selectionというのを使ってみたいと思います。これは、「After Effectsのプロジェクトパネルで選択しているアイテム群」を意味するAEスクリプトの書き方です。
app.project.selectionについては、ちょっと注意して欲しいことがあります。これは配列と呼ばれるのですが、複数のアイテムが入った集合体のデータになります。app.project.selection[0]とか、app.project.selection[1]と書くことで、1つ1つのアイテムを取り出すことができます。これは0から数え始めます(配列は基本的には0から数え始めますが、AEスクリプトでは1から数え始める場合もあります)。また、配列.length という書き方をすると、その配列に含まれているデータの個数が分かります。
この配列を利用して、複数のコンポに対応させたいと思います。また、ここでは配列とは切っても切り離せないfor文という書き方を利用することになります。
できました!
コード:
//myCompsという空の配列をつくっておく
var myComps = new Array();
//選択アイテムをselItemとする
var selItem = app.project.selection;
//selItemの数だけ繰り返し、selItem[i]がコンポなら配列 myComps に追加
for(var i = 0; i < selItem.length; i++){
if(selItem[i] instanceof CompItem){
myComps.push(selItem[i]);
}
}
//繰り返し終了、myCompsの取得が完了
//myCompsの数が0ではないなら処理に入り、そうでなければメッセージを表示
if(myComps.length !=0){
for(var i=0; i < myComps.length; i++) {
var RQ = app.project.renderQueue.items.add(myComps[i]);
RQ.applyTemplate("現在の設定");
var OM = RQ.outputModule(1);
OM.applyTemplate("ロスレス圧縮(アルファ付き)");
OM.file = new File("D:/Render/" + myComps[i].name);
}
}
else{
alert("コンポを選択して実行してください。");
}
今回は少し複雑なことをしています。まずは「現在選択しているコンポ群」というデータを手に入れる必要があります。そこで最初に var myComps = new Array(); と書いて、自分で新しくmyCompsという名前の配列のデータをつくりました。もっとも、この段階ではmyCompsの中身は空っぽです。ここに選択中のコンポをつめこもうというわけです。
次に、 var selItem = app.project.selection; と書いて、選択中のアイテムの配列を取得しています。しかし、このデータに含まれているのはコンポかもしれませんし、フォルダやフッテージかもしれません。とにかく「選択しているアイテム」です。そこで、ここからコンポだけを取り出してmyCompsの方に移してやりたいと思います。そこで必要になってくるのがfor文です。
for(var i = 0; i < ○○.length; i++) { } というのは繰り返しの構文です。i=0からスタートして、iを1つずつ大きな数字にしながら、○○の数になる前まで繰り返します。ほぼ決まった書き方なので、そういうものだと思ってください。ここでは、選択中のアイテムを1つずつ見ていって、コンポだったらmyCompsに加えるということをしています。配列.push(アイテム)というJavaScriptの書き方を使い、配列にコンポを加えています。
このようにしてmyCompsの中に「現在選択しているコンポ群」を入れることができました。ここまで来れば、後は簡単です。今度はこのmyCompsをfor文で繰り返し処理して、レンダーキューに追加するだけです。このようにして、複数コンポに対応することができました。このツールかなり頭いいですね!でも、もっともっと自動化しましょう!
コンポの名前を判別してキューを追加する!
私はもう、コンポを選択することすら面倒になってきました。「コンポの名前に"Render"という文字列が含まれていたらレンダーキューに追加する」というツールにしましょう。
できました!前半を少しアレンジしただけです。
コード:
//myCompsという空の配列をつくっておく
var myComps = new Array();
//アイテムの数だけ繰り返し、コンポなら名前が"Render"を含むかチェックし、含むなら配列myCompsに追加
for(var i = 1; i <= app.project.items.length; i++){
if(app.project.items[i] instanceof CompItem){
if((app.project.items[i].name.indexOf("Render")) != -1){
myComps.push(app.project.items[i]);
}
}
}
//myCompsの数が0ではないなら処理に入る
if(myComps.length !=0){
for(var i=0; i < myComps.length; i++) {
var RQ = app.project.renderQueue.items.add(myComps[i]);
RQ.applyTemplate("現在の設定");
var OM = RQ.outputModule(1);
OM.applyTemplate("ロスレス圧縮(アルファ付き)");
OM.file = new File("D:/Render/" + myComps[i].name);
}
}
else{
alert("名前にRenderを含むコンポはありません。");
}
今回はapp.project.itemsという書き方をしています。これは「After Effectsのプロジェクトパネルにあるすべてのアイテム群」を意味します。これも配列のデータなので、app.project.items(1)というふうに書いて、1つ1つを取り出すことができます。この場合は1から数えはじめます。
"Render"という文字列がコンポ名に含まれているかチェックするのに、indexOf(文字)というJavaScriptの書き方を使いました。指定した文字列を含まなかった場合に「-1」というデータを返してくるので、今回はそれを利用して、"Render"があるか判別しています。このツール超頭いい!
最後に
本格的なスクリプトでは、数百行、数千行のコードを書くこともあります。今回のスクリプトはたった20行程度です。それでも、十分に実用的ではないでしょうか?もちろん、このツールはまだまだ改良できます。
◆連番ファイル(シーケンスファイル)に対応させてみてはどうでしょうか?出力先に "_[####]" という文字列を追加すれば、連番ファイルをレンダーすることもできます。
◆コンポ名のままレンダーするのではなく、「コンポ名に文字列を追加した名前」にしてレンダーすることも可能です。逆に、「コンポ名から文字列を削った名前」にすることもできます。
◆日付を加えた名前でレンダーしてみるのはどうでしょうか?コンピューターから日付の情報を取得することもできます。
◆保存先をD:\Renderフォルダにするのではなく、さらにその中に新しいフォルダを作成するのはどうでしょうか?AEスクリプトから、ディレクトリに新しいフォルダを作成することも可能です。
◆今回はコンポ名を利用しましたが、コンポ名だけでなく現在開いているaepファイルの名前を利用することもできます。「app.project.file.name」と書けば、aepファイル名を取得できます。また、aepファイルが保存されているパスも取得できます。これは出力先に利用できるかもしれません。
ぜひ、自分専用にカスタマイズしてみてください。書き方を知れば、できることがどんどん広がります。AEスクリプトを楽しんでみてください!
これからAEスクリプトの勉強を始める方にオススメのサイトを厳選してみました。どれも素晴らしいコンテンツです。もちろん私が勉強する際にお世話になったサイトも含まれています。
◆プログラミングがわからない人のためのAfter Effectsスクリプト入門。その1 : あかつきみさきのブロマガ
◆特集:After Effectsをスクリプトで制御 AEP Project
◆OpenSpace / AfterEffects CC 2014自動化作戦
◆アニメの道具箱 dA-tools / JavaScript
◆アニメの道具箱 dA-tools / Script Labs
◆AfterEffects compZero / Script Menu
◆After Effects スクリプトリファレンス
◆bryful's Homepage 2nd
◆とほほのJavaScriptリファレンス
◆プログラミングがわからない人のためのAfter Effectsスクリプト入門。その1 : あかつきみさきのブロマガ
◆特集:After Effectsをスクリプトで制御 AEP Project
◆OpenSpace / AfterEffects CC 2014自動化作戦
◆アニメの道具箱 dA-tools / JavaScript
◆アニメの道具箱 dA-tools / Script Labs
◆AfterEffects compZero / Script Menu
◆After Effects スクリプトリファレンス
◆bryful's Homepage 2nd
◆とほほのJavaScriptリファレンス
- 関連記事
-
- AEスクリプトでレイヤーやエフェクトを一括削除する (2023/04/12)
- AEスクリプトのUIでイベントハンドラを使ってみる (2017/02/28)
- AEスクリプトでウィンドウ(GUI)をつくる方法 (2017/02/22)
- AEスクリプトで自分だけのレンダー設定ツールをつくって効率化する! (2014/10/12)