/**/

チュートリアル 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やディスクの能力を必要とせず、マシンの違いに関わらず、かなり一貫した結果が得られるはずです。古いシステムや処理の遅いシステムを使っていると、このチュートリアルの最初の例では、時々タイミングが正確でなくなることに気づくかもしれません。しかし、もしそうなったとしても心配することはありません。このチュートリアルの2つ目のパートでは、ノンリアルタイムモードを使用して、どんな質素なシステムであっても完璧な結果が得られる方法を紹介します。

リアルタイム処理

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

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


シンプルなレコーディングパッチ

read countdown 15.movと書かれたメッセージボックスをクリックして、ムービーを jit.qt.movie オブジェクトに読み込んで下さい。その次に metro オブジェクトのインレットに接続された toggle ボックスをクリックして 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のクオリティとタイムスケールを指定することができます。この例ではたった2つ(15.とjpeg)のアーギュメントしか使用していません。これらは出力ムービーのフレームレート(15.は1秒間に15フレームを意味しています)とcodec のタイプ(jpeg は Photo-JPEG を意味しています)を指定しています。write メッセージの全てのアーギュメントの完全な記述については、オブジェクトリファレンスの jit.qt.record オブジェクトの項目を参照して下さい。

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

2つ目の例のパッチはもう少し複雑です。このパッチには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 メッセージを出力することになります。

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

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

最後に、このパッチには、趣味の良いクロスハッチングフィルタ(jit.hatch オブジェクト)とそれのコントロール用の部分がつけ加えられています(ナンバーボックスと grid $1メッセージボックスです)。これらはレコーディング中にムービーを変化させるために使用することができ、再生してその効果を見ることができます。この部分を好きなように他のJitterオブジェクトやパッチに変更し、レコーディングされるムービーにリアルタイムで変化を加えることもできます。

ノンリアルタイム処理

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

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

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

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


framedump を用いたノンリアルタイムレコーディング

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

countdown.mov と書かれたメッセージボックスをクリックして jit.qt.movie オブジェクトにムービーを読み込んで下さい。その後、そのインレットに接続された toggle ボックスをクリックして metro オブジェクトをスタートさせて下さい。そしてパッチの一番下の jit.fpsgui オブジェクトが表示しているフレームレートを見て下さい。もし10fpsよりも大きな値が表示されていたら、あなたは私たちが使っているコンピュータよりもかなり良いものをもっていることになります。

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

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

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

サンプルパッチでは、jit.qt.record オブジェクトが、フレームのレコーディングが終わるごとにそのマトリックスを左アウトレットから出力することも有効に利用しています。フレームが出力されると、counter オブジェクトに bang が入力されます。そして counter オブジェクトから出力された数値は jit.hatchフィルターの grid アトリビュートの値を設定します。これによって、QuickTimeムービーのキャプチャが進むにつれて、繰り返し変化する処理のシーケンスが作られます。

readメッセージボックスをクリックして今作成したムービーを開いてみて下さい。metroを on にしてムービーを表示して下さい。gate オブジェクトに接続された toggle ボックスをクリックして新しく作成したムービーを見て下さい。この切り替えによって、 jit.qt.movie オブジェクトからの出力はエフェクト処理のオブジェクトを通過せず、じかに jit.pwindow に入力されます。

まとめ

jit.qt.record オブジェクトは、イベント駆動の方式で、JitterのマトリックスをQuickTimeムービーとしてレコーディングすることができます。Jitterのパッチを操作してその結果をリアルタイムでレコーディングしていくことも、ノンリアルタイムでムービーのレンダリングの様にして使用することも可能です。 jit.qt.movieオブジェクトに framedump メッセージを送ることによって、フレームの抜け落ちを生じさせずに、ムービーファイルの全てのフレームを処理することができます。この方法によって、コンピュータのプロセッサにかかる負荷に関わりなく、ハイクオリティなムービーをレコーディングすることが可能です。