チュートリアル19

QuickTimeムービーの記録


このチュートリアルでは一枚以上の連続したマトリックスをQuickTimeムービーとしてディスクに記録する方法をお見せします。リアルタイム/ノンリアルタイムに記録するためにjit.qt.recordオブジェクトの使用法を紹介します。途中、出力ムービーのセッティングを調整する方法もいくつか紹介します。

多くのJitterオブジェクトと同様に、jit.qt.recordオブジェクトは、時間駆動型よりもイベント駆動型のモデルに従って処理を行います。フレームは記録可能な状態のjit.qt.recordオブジェクトに送られると、入力されるフレーム間の時間の差とは関係なく、出力ムービーのタイミング特性に基づいて進行中のムービーに次のフレームとして追加されていきます。この方法を採ることで、結果、フレーム間のタイミングも均一になり非常に滑らかにムービーが記録されます。しかし、この方法を採るためには記録の前にいくつかの準備が必要です。

jit.qt.recordオブジェクトはこのチュートリアルで説明されている標準の方法の他に、時間駆動型(リアルタイム)の方法で記録を行うこともできます。このリアルタイムの処理方法は標準の方法よりもシンプルにみえるかもしれません。しかし、記録されたものは滑らかにはならないでしょう。なぜなら入力されるムービーのフレームは普通、記録の最中、頻繁に抜け落ちているからです。
時間駆動型はrealtimeメッセージを用いることで設定することが出来ますが、このチュートリアルで説明されているノンリアルタイムやイベント駆動型とはかなり違います。

道順は色々

jit.qt.recordオブジェクトに入力された全てのマトリックスは出力ムービーの一部として加えられる前に必ず圧縮されます。この圧縮の速度はいくつかの要因によって決まります。それは、プロセッサの速度、ディスクドライブの速度と、- 最も重要です-圧縮のタイプ(codec-compression/decompressionの頭文字の短縮形です-と呼ばれています)です。このチュートリアルの例ではPhoto-JPEG codecを使用します。これは高いCPUやディスクの能力を必要とせず、マシンの違いに関わらず、かなり一貫した結果が得られるはずです。古いシステムや処理の遅いシステムを使っていると、このチュートリアルの最初の例で、時折タイミングが正確でなくなる事に気づくかもしれません。しかし、もしそうなったとしても心配することはありません。このチュートリアルの二つ目のパートでは、ノンリアルタイムモードを使用して、どんな質素なシステムであっても完璧な結果が得られる方法を紹介します。


リアルタイム処理

・Jitter Tutorialフォルダのチュートリアルパッチ 19jRecording.patを開いてください。

最初の例では最も基本的な記録の設定をしています。jit.qt.recordオブジェクトには2つのアーギュメント(320と240)があります。これは、このオブジェクトを使って、記録されるムービーの横幅と高さを指定していることに注意してください。


シンプルな記録パッチ

・read countdown 15.movと書かれたメッセージボックスをクリックして、ムービーをjit.qt.movieオブジェクトに読み込んでください。その次にmetroオブジェクトのインレットに繋がったトグルボックスをクリックしてmetroオブジェクトをスタートさせてください。jit.pwindowにムービーが映し出されるでしょう。これはjit.qt.recordオブジェクトが、受け取ったマトリックスを全て左アウトレットから通過出力するからです。(このパッチのjit.robcrossオブジェクトはシンプルなエッジ検出をするもので、マトリックスは処理されて通過します。)

・write 15.jpegと書かれたメッセージボックスをクリックして、ムービーの書き出しをスタートさせてください(後にこのメッセージボックスの内容に関して詳しく説明します)。ファイルダイアログボックスが現れて、ファイルの名前を指定するように指示してくるでしょう。適当な名前を入力してSaveボタンをクリックすると、指定した名前のファイルに対して記録がスタートします(ここでは説明のために、ファイル名をmyfilename.movと指定したとします)。stopと書かれたメッセージボックスをクリックして記録を停止してください。

jit.qt.recordオブジェクトはムービーが正常に書き込まれたかどうかの確認が出来るように、書き込み処理の後に右アウトレットからメッセージを出力します。このパッチではprintオブジェクトをそのアウトレットに繋いでいるので、Maxウィンドウでその結果を見ることが出来ます。全てが正常に実行されたのであれば、Maxウィンドウにはprint:write myfilename.mov 1と表示されるでしょう。何か問題が生じたのであれば、ファイル名の後には1ではない数字が表示されます。

jit.qt.movieオブジェクトに繋がれているreadとかかれたメッセージボックスをクリックし、たった今記録したムービーを読み込んでください。どのように見えますか?

jit.qt.recordオブジェクトに対するwriteメッセージについて詳しく見てみましょう。このwriteメッセージはjit.qt.recordオブジェクトをレコーディング可能な状態にするメッセージです。ただし、実際の記録はオブジェクトがインレットにマトリックスを受け取らないと始まりません。writeメッセージは数個のアーギュメントを必須ではありませんが付けることが出来ます。それは出力ムービーのファイル名、フレームレート、codecのタイプ、そしてcodecのクオリティとタイムスケールです。この例ではたった二つ(15.とjpeg)のアーギュメントしか使用していません。それらは出力ムービーのフレームレート(15.は一秒間に15フレームを意味しています)とcodecのタイプ(jpegはPhoto-JPEGを意味しています)を指定しています。writeメッセージの全てのアーギュメントの全ての記述については、オブジェクトリファレンスの jit.qt.recordオブジェクトの項目をご覧ください。

metroオブジェクトを設定して66.67ミリ秒毎にbangメッセージを出力させていることに注目して下さい。これは入力されているムービーのフレームレートと一致させています。metroオブジェクトがbangを出力する時間間隔を変えてもう少しムービーを記録すると、metroの時間の設定値を早く(小さく)するとムービーは長く遅く、metroの設定値を遅く(大きく)すると短く速いムービーになることが分かるでしょう。これはjit.qt.recordがイベント駆動の方式を使用しているためです。

2つ目の例のパッチはもう少し複雑です。このパッチには二つの重要な追加がされています(いくつかの細かい追加もされています)。


異なるパッチですが同じ事をしています。

まず、(getfpsメッセージを使用することにより)自動的にオリジナルムービーのフレームレートが検出されます。そしてその値は、jit.qt.recordオブジェクトを動作させるmetroオブジェクトの設定値と、出力ムービーのフレームレートの設定を設定するのに使用されています。パッチのこの部分を詳しく見てみましょう。

・ムービーがjit.qt.movieオブジェクトに正常に読み込まれると、このオブジェクトは read filename.mov 1というメッセージを右アウトレットから出力します(もしreadの処理が正常に行えなかった場合、数字は1ではなくなるでしょう)。ここではrouteオブジェクトを使用してこのメッセージを取り出しています。

unpack s 0オブジェクトは残っているメッセージの要素を分解します。この場合ファイル名は必要なく、readの処理が成功したか否かの情報のみが必要です。そこでunpackオブジェクトの左アウトレットには何もつけず、そして右アウトレットにselectオブジェクトをつけて整数の1を検出するようにしています。readの処理が正常に行われると、selectオブジェクトはbangメッセージを出力することになります。

・bangはjit.qt.movieオブジェクトへのgetfpsメッセージボックスに送られます。そしてこれを受け取ったjit.qt.movieオブジェクトはfps [fps]というメッセージを右アウトレットから出力します。この[fps]メッセージの内容は、小数点を含む数値で、読み込まれたムービーのフレームレートを表しています。この値は routeオブジェクトの真ん中のアウトレットから出力され、metroオブジェクトのスピードと出力ムービーのフレームレートを設定します。

このパッチにはもう一つ改良された部分があります。パッチの全体をオリジナルのムービーのフレームレートで動作させるのではなく、thruをoffにしたjit.matrixを使用してここまでの出力をここで受け、2つ目の metroを使用してbangメッセージをjit.qt.recordに適切なフレームレートでjit.matrixに送っています。これは、このパッチが部分ごとに独立に、思い通りに速くしたり遅くしたりして動作させることを可能にしています。そしてこのパッチでは本当に最後の部分だけが記録処理に特化されたタイミングで動作します。

最後に、このパッチには、さっぱりしたクロスハッチングフィルタ(jit.hatchオブジェクト)とそれのコントロール用の部分を付け加えてあります(ナンバーボックスとgrid $1メッセージボックスです)。これらは記録中にムービーを修飾するのに使うことが出来ます。そして再生することでその効果を見ることが出来ます。この部分を好きなように他のJitterオブジェクトやパッチに変更し、リアルタイムに記録されるムービーに装飾を加える事も出来ます。


非リアルタイム処理

ここまでに見た2つのパッチには問題があります。高いプロセッサ処理能力が無いと、これらのパッチではフレームが抜け落ちてしまうのです。しかし多くの場合、これは問題にはなりませんし、見てきた2つのパッチは、ライブパフォーマンスを含めたどんな状況でも記録をするのに適しています。

しかし、どうすれば出力ムービーとオリジナルのムービーのフレームが全て同じになるように記録できるのでしょう?そしてそこまで高い性能を持たないプロセッサとディスクという環境で、ムービーのレンダリングをして全ての処理されたフレームをキャプチャするためにはどうしたら良いのでしょう?

方法はあります。jit.qt.movieオブジェクトにframedumpメッセージを送ることでノンリアルタイム再生モードを使うことが出来ます。これがjit.qt.recordオブジェクトと完全に同期して動作するのです。

・パッチャーウィンドウを下にスクロールさせて3つ目の例を見てください。


framedumpを用いたノンリアルタイム記録

一見、3つ目の例は前の例と比べてそんなに複雑になったように見えないかもしれません。しかし騙されてはいけません。この気取らないパッチは最速のコンピューターさえ屈服させてしまうでしょう。

・countdown.movと書かれたメッセージボックスをクリックしてjit.qt.movieオブジェクトにムービーを読み込んでください。その後、そのインレットに繋がったトグルボックスをクリックしてmetroオブジェクトをスタートさせてください。そしてパッチの一番下のjit.fpsguiオブジェクトが表示しているフレームレートを見てください。もしも10fpsよりも大きな値が表示されていたら、貴方は我々が使っている物よりもかなり良いコンピュータをお持ちです。

このパッチはリアルタイムには重い動作をしますが、ノンリアルタイムでQuickTimeムービーを作る際には絶大な仕事をします。jit.qt.movieオブジェクトframedumpに送り、jit.qt.recordオブジェクトを組み合わせて使用するとこのパッチは取りこぼし無くオリジナルのムービーの全てのフレームをキャプチャし、処理を行い、オリジナルのムービーと同じ長さのムービーを出力します。

ここに動作の流れを説明します。jit.qt.movieオブジェクトはframedumpメッセージが入力されるとムービーの再生を止め、一度に一つずつ、各フレームを出力します。(注意:フレームを出力させるのに jit.qt.movieオブジェクトにbangメッセージやoutputmatrixメッセージを送る必要はありません。)これはMaxのスケジューラーの仕様により、一つ前のフレームがまだ処理の途中であったり、記録の最中である時には、新しいフレームが出力されないようになっています。それでは試してみましょう。

metroオブジェクトに繋がったトグルボックスをクリックして、metroをoffにしてください。
(framedumpの処理を行っている最中にjit.qt.movieオブジェクトにbangメッセージを送ってしまうと余計なフレームが出力されてしまいます。この場合それは目的とは逸れてしまうのです。)このパッチの左上の隅にはwriteメッセージを送り出すpackオブジェクトとframedumpメッセージの2つに結線されたボタンがあります。ボタンを押し、ファイルダイアログが表示されたらファイル名を入力して、ムービーのレンダリングの時間、待ってください。framedumpの処理が終了すると、jit.qt.movieオブジェクトはその右アウトレットからframedump doneのメッセージを出力します。この例のパッチではこのメッセージが出てくるとjit.qt.recordにstopメッセージが送られるようになっています。

この例のパッチでは、jit.qt.recordオブジェクトが、フレームの記録が終わるごとにそのマトリックスを左アウトレットから出力する事も有効に利用しています。フレームが出力されると、counterオブジェクトにbangが入力されます。そしてcounterオブジェクトから出力された数値はjit.hatchフィルターのgridアトリビュートの値を設定します。この構造はQuickTimeムービーのキャプチャの際、エフェクトの変化のシーケンスを繰り返せるようにしています。

・readメッセージボックスをクリックして今作成したムービーを開いてみてください。metroをonにしてムービーを表示してください。gateオブジェクトに繋がったトグルボックスをクリックして新しく作成したムービーを見てみましょう。この切り替えでjit.qt.movieオブジェクトからの出力はエフェクト処理のオブジェクトを通過せずに直にjit.pwindowに入力されます。

まとめ

jit.qt.recordオブジェクトはイベント駆動の方式でJitterのマトリックスをQuickTimeムービーとして記録する事が出来ます。Jitterのパッチを操作してその結果をリアルタイムで記録していく事も、ノンリアルタイムでムービーのレンダリングの様にして使用することも出来ます。 jit.qt.movieオブジェクトにframedumpメッセージを送ることで、ムービーファイルの全てのフレームを抜け落とす事なく処理を行う事が出来ます。この方法を用いることで、コンピューターの処理負荷に関わりなくハイクオリティなムービーを記録する事が出来ます。