aerenderでレンダリング
今回はAfter Effectsに付属するaerenderを使ったバックグラウンドでレンダリングする手順を説明します。まず、バックグラウンドでレンダリングを行うスクリプト「バックグラウンドでレンダリング.jsx」を紹介します。
ダウンロードはここからできます。
bgRender.zip
!追記
WindowsVista以降で動かなかったので修正。Macでも一応動くようになりました。
ダウンロードはここからできます。
http://bry-ful.ddo.jp/BRY/software/ScriptDiary/bgRender_WinMac.zip
バックグラウンドでレンダリング.jsx
このスクリプトは単純にaerender.exeを呼び出してるだけで実はかなり簡単なスクリプトです。同じスクリプトで”BG Renderer“があります(AEP Projectでも紹介されているので参照してください。ここです)
間違いなく機能的にも使い勝手的にもBG Rendererの方が上です。このスクリプトの存在を知ったのは「バックグラウンドでレンダリング.jsx」を作った後のなのでかなり凹みました。ただ、BG Rendererは内部で何をしているか遮蔽されたスクリプトなのでエラーで対処に困るという話があります。調べてみましたが、それはBG Rendererが原因ではなく説明不足によるものがほとんどと思いました。
バックグラウンドでレンダリング.jsxは基本的にBG Rendererと同じ事をしてるはずなので、この説明を読めばBG Rendererも使いやすくなると思います。
さて説明です。このスクリプトは最低でもレンダーキューに1個レンダリング可能なアイテムが登録していないと実行できませんので注意です。
実行すれば、DOSコンソールが開いてレンダリングが開始されます。終わればいつもの終了音がなります。
そんなに長いスクリプトではないので全部見せます。
(function(me){ var listPro_items = ["Lo(推奨)","Normal" ]; //------------------------------------------------------------------------- var winObj = ( me instanceof Panel) ? me : new Window("palette", "バックグラウンドでレンダリング", [ 866, 465, 866+ 179, 465+ 89] ,{maximizeButton:true, minimizeButton:true}); //------------------------------------------------------------------------- var btnExec = winObj.add("button", [ 7, 12, 7+ 164, 12+ 23], "バックグランドでレンダー開始" ); btnExec.graphics.font = ScriptUI.newFont("Tahoma",ScriptUI.FontStyle.REGULAR, 11); var stPro = winObj.add("statictext", [ 4, 46, 4+ 82, 46+ 14], "プロセス優先度"); stPro.graphics.font = ScriptUI.newFont("Tahoma",ScriptUI.FontStyle.REGULAR, 11); var listPro = winObj.add("dropdownlist", [ 92, 42, 92+ 79, 42+ 21], listPro_items); listPro.items[0].selected = true; listPro.graphics.font = ScriptUI.newFont("Tahoma",ScriptUI.FontStyle.REGULAR, 11); var cbExecGo = winObj.add("checkbox", [ 7, 68, 7+ 79, 68+ 18], "強制実行"); cbExecGo.graphics.font = ScriptUI.newFont("Tahoma",ScriptUI.FontStyle.REGULAR, 11); //------------------------------------------------------------------------- function exec() { function wq(s){ return "\""+ s + "\"";} if ($.os.toLowerCase().indexOf("windows") <0){ alert("すみません。Windows専用です。"); return; } if ( app.project.file == null){ alert("プロジェクトを保存してください。"); return; } //レンダーキューの確認 var rq = app.project.renderQueue; var rqOK = false; if ( rq.numItems>0){ for (var i=1; i<=rq.numItems; i++){ if ( rq.item(i).status == RQItemStatus.QUEUED) { if ( rq.item(i).numOutputModules>0){ for (var j=1; j<=rq.item(i).numOutputModules; j++){ if (rq.item(i).outputModule(j).file != null) if (rq.item(i).outputModule(j).file.parent.exists == true){ rqOK = true; break; } } } } if (rqOK == true) break; } } if (rqOK==false){ alert("有効なレンダーキューがありません。"); return; } var proOp = ""; switch (listPro.selection.index) { case 1: proOp = "/normal";break; case 0: default: proOp = "/low"; break; } var execGo = cbExecGo.value; //一時的に別ファイルにaepを保存して、Batchファイルを作成。 var af = app.project.file; var tmpAep = new File(Folder.temp.fullName + "/" + "aerender_temp_.aep"); if (tmpAep.exists) { if ( execGo == true) { cbExecGo.value = false; tmpAep.remove(); }else{ alert("現在バックグラウンドでレンダリング中です。\nしていない時は強制実行をONにしてください。"); return; } }; app.project.save(tmpAep); app.project.save(af); var aer = new File(Folder.appPackage.fullName + "/aerender.exe"); var cmd = "@echo off\r\n"; cmd += "start \"\" /b " + proOp +" /wait "; cmd += wq(aer.fsName)+ " -project " + wq(tmpAep.fsName) + " -sound ON\r\n"; cmd += "del " + wq(tmpAep.fsName) + "\r\n"; var bF = new File( Folder.temp.fullName + "/aerender.bat"); if ( bF.exists==true) bF.remove(); if (bF.open("w")){ try{ bF.write(cmd); }catch(e){ alert(e.toString()); }finally{ bF.close(); } } //実行 if ( bF.exists==true) bF.execute(); } btnExec.onClick = exec; //------------------------------------------------------------------------- if ( ( me instanceof Panel) == false){ winObj.center(); winObj.show(); } //------------------------------------------------------------------------- })(this); |
100行超えてますが、ほとんどがUIを作ってるところとエラーチェックで本体部分(exec関数)はとてもシンプルです。
exec()関数のところだけを解説します。
まず、最低限のエラーチェックを行なっています。(19行から47行目くらいまで)
プロジェクトが保存されていない時と有効なレンダーキューがない場合はエラーとして実行を停止してます。
特にレンダーキューの確認はしっかり行います。RenderQue Objectのstatusを見たあとにOutputModuleで有効なパスが設定されているか調べています。OutputModuleは複数存在している場合があるので総当りで調べます。
まぁ以上はエラーチェックとしては最低レベルなので、もう少し厳しくしないとダメだと思います。
言い忘れていましたが、このスクリプトはWindows専用です。理由は後で説明しますが、そのためMacでこのスクリプトを実行したときもエラーで止まるようにしてあります。
!追記
Windows vista 以降ではsystem.osNameは機能しないようです。$.osに変えれば大丈夫です。
動作オプションとして「プロセス優先度」と「強制実行」とあるのでUIからその獲得を行なっています。(48用目から56行目)
プロセス優先度とはバックグラウンドで実行させていた時にPCのパワーのほとんどを使ってしまうとその他の作業が出来なくて、バックグラウンドでレンダリングさせる意味がなくなってしまうので重要です。Loが推奨です。
強制実行は、このスクリプトは2回以上のバックグランドでのレンダリングを禁止しているのですが、レンダリング中にエラーでちゃんと終了しないと全く実行できない状態になってしまう危険があります。そのためこのスイッチをONにすれば強制的にレンダリングが始まるようになっています。
バックグラウンドで実行中の時に安全に作業するために、aepファイルを適当なところに保存し直しています。(57-70)
Folder.tempでOS提供の一時ファイル保存場所に適当な名前(aerender_temp_.aep)で保存した後、元の場所名前で保存し直して復帰させています。
二重実行を禁止するために、ここで保存し直したaepファイルが既にあったら実行を止めています。
そのためレンダリングが終わったら、この一時ファイル(aerender_temp_.aep)を消す処理が必要になります(これは後で)
あとは、aerenderを呼び出せばいいだけですが、少し困った問題があります。
通常ならばSystem.callSystem()で呼び出せばいいのですが、このメソッドは呼び出したプロセスが終了するまでAFを停止させてしまいますので使えません。
後はFile.execute()で実行させる事ができますが、こいつは細かなオプション指定ができません(マウスでダブルクリックするアクションと同じ)
仕方ないので、適当なBatchファイルを作成してFile.execute()で実行というスタイルに落ち着きます。BG Rendererも間違いなく同じ手順で呼び出している筈です。
余談ですがWindowsだけなら「After Effectsユーザーのための、プログラミング入門 その5 callSystem」で紹介したProcessStart.exeを使ってcallSystem()から実行しても出来ます。専用のコマンドをC#当たりで作ってしまってOKです。
BatchファイルとはWindowsのコンソールであるcmd.exeのシェルスクリプトの事で、古いPCユーザーの方なら多分かなり馴染みなものですが、最近の人は全然だと思います。
まぁそんなに難しいものではないので適当にgoogleさんで調べてください。調べる時のキーワードは 「cmd.exe バッチファイル」です。
具体的にこのスクリプトが書き出すBatchファイルは以下のようになります。
@echo off start "" /b /low /wait "C:\(略)\aerender.exe" -project "C:\(略)\aerender_temp_.aep" -sound ON del "C:\DOCUME~1\(略)\aerender_temp_.aep" |
aerender.exeをstartで呼び出して、実行終了後aepファイルを削除しています。
このBatchファイルを工夫すればaerender.exeの実行動作を変えることができます。
startコマンドは、cmd.exeの内部コマンドで呼び出す実行ファイルの動作設定を指定するものです(通常動作ならstartコマンドを使わなくてもOK)
第1引数はウィンドウタイトルで今回の場合は空白を指定してます。省略するとエラーを起こすので注意です。
/b で新しいウィンドウを開かないモードにして、/waitでプログラムの実行が終わるまで待つ設定にしています。このようにしないと次の行でdelが終了前に実行されてしまうので注意です。
/lowがプロセス優先度の指定です。仕様ではもっと細かい指定ができる筈ですが、実際は/loと/normalの2種類しか指定できません。
以上のコマンド文字列を作成します。パス指定は全てフルパスで行う必要があり、なるべく2バイト文字が使われていないことが理想です。わざわざtempへ保存しなおすのは、2byteコードのパスをなくすためでもあります。また、半角スペースを含んだパスは””でくくる必要があります。
aerender.exeのフルパスは、Folder.appPackageで実行ファイルのFolder objectを獲得してそれから作成しています。マニュアルではFolder.appPackageはMacOSでのみ有効とありますが、調べたところWindowsでも問題なく獲得できました。
パスは、普段AEスクリプトで使うurl形式(/c/Program )ではなくWindowsパス形式(C:\Program)にしないといけないのでFile.fsNameで獲得しています。
ここまで説明すれば、上のコードを読めば特に問題なく理解できると思います。
Batchファイルは改行コードをCR+LF、文字コードをshif-jisにしてそのままテキスト保存すれば大丈夫です。
以上がWindowsの場合で、Macの場合はターミナルのシェルスクリプトに書き直すことが必要です。やる手順は同じですので簡単に同じ事が出来ると思います。
因みに、BatchファイルでやらずにWSH(Windows Script Host)でやっても同じことが出来ます。
WSHの方がダイアログが使えたりとか便利なので、使える人はWSHの方が楽かなとか思います。ダイアログ等も使えますので。
aerenderを使うときの注意
aerenderについては、After Effectsのヘルプに詳細な説明があります。オンラインではここ(CS4)かここ(CS5)で見ることができます。見ればわかると思いますが、After Effectsでのレンダリングの基本的な指定ができるだけで特に難しいことはないのです。
- -project
プロジェクトファイルの指定(必ずフルパス)
- -sound
終了音を鳴らすかどうか
- –mem_usage メモリ関係の指定。使用には注意
- -mp < 0 or 1> 1の場合マルチプロセッシングを有効にして複数のフレームを同時にレンダリングする。
- -sound
使用するときの注意点は以下のとおりです。
- パス指定に2バイトコード(半角以外の文字)はなるべく使わない。
- aerenderの起動オプションとAfter Effectsの環境設定の矛盾に注意。
たとえば、マルチプロセッシングで複数のフレームの同時レンダリングが環境設定で指定されていても、aerenderの -mpオプションが付けられていないと有効にはなりません。
- レンダリングエンジンモードでのプラグインの動作を確認。
aerender.exeでのレンダリングは基本的にレンダリングエンジンモードになるので、若干通常のAfter Effectsと環境設定のデフォルトが違うので要注意です。
特にプラグインの動作環境が変わるのでシリアライズ等が外れて正常にレンダリングできない・動作が止まる等のトラブルが起きる可能性があり、aerederでのレンダリング中には全く気がつかない(エラーが表示されない・気がつかない)のではまります。
aerender.exeでレンダリングを行う場合は、レンダリングエンジンモードでの動作確認を事前に行っておくと安心できます。-reオプションか-wfオプションで「フォルダを監視」状態で起動すればレンダリングエンジンモードになるのでそこで動作確認ができます。
- メモリの使用状態の確認。After Effectsとaerenderが同時に動く環境にする。
バックグランドでのレンダリングを行う場合、環境設定:メモリ&マルチプロセッサでaerenderで使うメモリとCPUを確保しておかないとエラーばかりで困ることがよくあります。
普段の作業のためAfter Effectsに多くのリソースを割り当てていた場合、aerenderでバックグランドレンダリングしたくてもリソースがなくて単純にメモリ不足で落ちたり、CPUパワーが不足してPCの操作ができなくなったりして最悪PCもろともハングする危険があるので注意です。
BG Rendererを使った時に起きるトラブルは大抵上記の事が原因になってます。
バックグラウンドで効率的にレンダリングする
今回のスクリプトで「バックグラウンドでレンダリング」する目的はたいていの場合、「After Effectsで作業しながら、レンダリングしたい」になると思います。そのため「レンダリングにかかる時間」より「快適に作業ができる」事が優先されます。十分に余力のあるPC(64bitで多くのメモリがある場合)は特に気にすることはないのですが、Windows XPとCS4の組み合わせの場合は、かなり配慮しないとダメです。
気分的にレンダリングは早く終わって欲しいといつも思ってしまいますが、バックグランドでのレンダリングでは作業に支障ないように行うことがポイントです。
設定としては「プロセスの優先度」を通常より下げておく事です。「プロセスの優先度」はタスクマネージャを立ち上げてプロセスタブで右クリックで表示される項目にあります。
タスクマネージャで見た場合、aerenderはAfterFX.comと表示されています。スクリプトから行なった場合はデフォルトが「低」になっているので特に気にしなくてもいいようになっています。
あと、「環境設定」「メモリ&マルチプロセッサ」での設定も重要になります。
ここで「他のアプリケーションで使用するRAM」をある程度確保しておかないとaerenderはリソースを使い尽くして、マウスカーソルがほとんど動かない等の悪い影響が出ます。
上の例ではOFFにしていますが、「複数のフレームを同時にレンダリング」がONの場合は色々と注意が必要になります。
以上のことはPCの個体差による影響が大きく同時期の同じメーカーの同じ構成のPCであってもかなり設定の値にばらつきがあり、最適な値を求めるのに苦労します。
とりあえずは余裕を持った設定にするのが結果的には一番だと思います。
今回はバックグラウンドでのレンダリングのための事ですが、逆に「レンダリング速度に最適化する」設定も見つけておくと楽になると思います。
特にプロセスの優先度を「リアルタイム」にするとビックリするくらい速度が向上します。まぁ、その状態では他の作業がほぼ不可能になりますけど。
aerender_MamiSan.exe
aerender.exeはコマンドライン専用でかなり使いずらかったので、フロントエンドアプリケーションを作ってみました。使い方は簡単で、aepファイルをこのウィンドウへドラッグ&ドロップしてリストに登録して後は起動用のBatchファイルを書き出すか、そのままバッチ実行するだけです。
必要に応じてオプションを変えたりできますが、レンダリング設定・出力モジュール設定を選択したい時はあらかじめそれぞれのテンプレート保存ファイル(*.ars/*.aom)をAfter Effectsから書き出してaerender_MamiSan.exeに読み込ませてください。
作った動機は複数のaepをまとめてレンダリングする必要があったので、aerender.exeを簡単に呼び出して実行させるbatchを手作業で作成してたのが面倒なので楽にしようと思ったことです。あとから考えれば「フォルダの監視」でやったほうが楽ですな。
aerenderのその他の用途
今回のaerenderをスクリプトから実行するテクニックを使用すれば他の用途にも応用できます。「バックグラウンドでレンダリング」はプロクシのレンダリング中に別の作業を行うってのが主な目的ですが、その他として「素材作成」にも応用が聞くと思います。今考えているだけでも
- psdレイヤで書き出しを自前で行う。
フレームの保存でphotoshopレイヤを書き出す場合、一枚一枚のレイヤの書き出しは軽いのでaerenderに回してバックグラウンドで行い書き出し場所もついでに指定とか
- セルの処理をあらかじめ終わらせておく
最近のTVアニメのセルの処理はかなり重たくなってきてるので、スクリプトで選択して素材段階で先にレンダリングしてしまう。ただそのレンダリングはネットワークレンダリングに回さずローカルPCのバックグランドレンダリングで行う。
- エクセル等のスプレッドシートからのレンダリング管理
エクセルでレンダリングの管理が出来ます(ちょっと自信ない^^;) エクセルからaepファイルを獲得してaerenderへ回してレンダリングさせることも可能です。
等あります。
市販品では、Max 3Dのにバンドルされているネットワークレンダリング用ソフトBackburnerもaerender.exeを呼び出してAEの監視フォルダの機能を使わずにネットワークレンダリングさせることができます。レンダリングの優先度を細かく制御できるのでかなり便利です。特に監視フォルダではPCの数が増えるとどんどん効率が悪くなっていきますが、Backburnerは流石に効率的です。
僕も適当に作ったら、ここで追加投稿したいと思ってます。
最後に
今回は急遽思いついて投稿したものです。(twitterで今回のスクリプトを発表したら、意外な反響があったのが理由)本当はBG Rendererの存在を知った段階で作るのをやめようと思ってました。BG Rendererはお金払う価値のある素晴らしいスクリプトです。ただ、内部動作の説明がほぼないので、それを知らない人が使うのは大変そうだったのでそのサポートしてこの記事を書きました。また、aerenderのススメって意味もあります。
それでは!
新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/pjWKjabc
新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/pjWKjabc
AEP PROJECTに「バックグランドでレンダリング」の記事を投稿しました。http://t.co/l0rAi2Ir
新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/pjWKjabc
AEP PROJECTに「バックグランドでレンダリング」の記事を投稿しました。http://t.co/l0rAi2Ir
新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/pjWKjabc
これはメモしとこう。 RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/vtEJnCN8
一応メモ。 RT @aokijun: これはメモしとこう。 RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/cDcaViJC
AEP PROJECTに「バックグランドでレンダリング」の記事を投稿しました。http://t.co/l0rAi2Ir
これはメモしとこう。 RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/vtEJnCN8
新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/pjWKjabc
新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/pjWKjabc
これはメモしとこう。 RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/vtEJnCN8
RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/F6j8BanM #CGWjp
RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/F6j8BanM #CGWjp
RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/F6j8BanM #CGWjp
げ。知らなかったよ! RT @aeusers: 新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/7NUtk6GG
RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/F6j8BanM #CGWjp
RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/4pW4c0oA
RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/F6j8BanM #CGWjp
新着記事 : After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/pjWKjabc
After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/d2A87izT #aejp via @AEUSERS
「After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング」AEP Project http://t.co/WqkRkyxH #CS5_jp
Nucleoとかもそうだったけど、BGレンダーってどうなの。RT @AdobeCS_jp 「After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング」AEP Project http://t.co/RaTNZ8hG #CS5_jp
スクリプト以外の言語はさわったことがないユーザー向けに、C#/AEのJavaScriptを中心にプログラム全般を解説する連載です。今回はaerenderを使った、バックグラウンドでレンダリングする手順を解説しています。http://t.co/WqkRkyxH
スクリプト以外の言語はさわったことがないユーザー向けに、C#/AEのJavaScriptを中心にプログラム全般を解説する連載です。今回はaerenderを使った、バックグラウンドでレンダリングする手順を解説しています。http://t.co/WqkRkyxH
スクリプト以外の言語はさわったことがないユーザー向けに、C#/AEのJavaScriptを中心にプログラム全般を解説する連載です。今回はaerenderを使った、バックグラウンドでレンダリングする手順を解説しています。http://t.co/WqkRkyxH
レンダリングログが残らないのが残念。ログを残せるようにするのって簡単にできるのですか?
ログは、aerender.exeに渡すBatchファイルの記述に –logとログファイルのフルパスを追加すればいいので、比較的簡単だと思います。ただログファイルのフルパスを指定するUIを作成するのが一番面倒なところでしょうか?
例えば、スクリプトの75行目を
cmd += wq(aer.fsName)+ ” -project ” + wq(tmpAep.fsName) + ” -sound ON -log ” + wq( app.project.file.fsName +\”.log\”) + “\r\n”;
と書き換えればlogファイルは書き出せると思います(動作確認はしてないので、ちょっと不安ですが)
あ、拡張子を追加するところに何故か\が入ってしまった。
cmd += wq(aer.fsName)+ ” -project ” + wq(tmpAep.fsName) + ” -sound ON -log ” + wq( app.project.file.fsName +”.log”) + “\r\n”;
ですね。すみません。
これで事足りたからBG Renderer2は保留 http://t.co/rdELRtcb
バックグラウンドでレンダリングって、ちゃんとストレスなく作業できるのかな? 怖くて実験できないw After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/UAyYg2WV
CS6で動いた人いますか?|After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/Y7f8TaQb
Windows専用の判定を削ったら動いた!報告も兼ねて @bryfulRT @precompose: CS6で動いた人いますか?|After Effectsユーザーのための、プログラミング入門 その13 バックグラウンドでレンダリング http://t.co/Y7f8TaQb