チュートリアル21

ライブ映像とオーディオ入力を共に使う


このチュートリアルでは、ウェブカムやDVカメラ、PCIのビデオカードといった、QuickTimeと互換性のあるイメージキャプチャデバイスのJitter上での扱い方、映像のシーケンスを入力してマトリクスとして使用したり、直接ディスクに記録したりといった事を説明していきます。Jitterを使って、サウンドのデータを直接QuickTimeムービーとしてディスクに記録する事も出来ます。

このチュートリアルのパッチの例は、あなたがQuickTime互換のイメージキャプチャデバイスの電源を入れてコンピュータに繋いでいると仮定して進めます。


シーケンス入力の基本

入力デバイスから映像のイメージをキャプチャするとき、私達は実際には連続したイメージ(イメージのシーケンス)を扱っています。チュートリアル20では、jit.qt.movieオブジェクトのexport処理を使って、イメージのシーケンスを作りました。今回はjit.qt.grabオブジェクトを使って、イメージのシーケンスを取り込んでみます。

jit.qt.grabオブジェクトを使うことで、QuickTimeコンポーネントの中から一つのコンポーネントを利用することが出来ます。コンポーネントはQuickTimeで用いられている一般的なメカニズムで、これを利用することでオブジェクトの機能を拡張しています。コンポーネントには、新しい映像のcodecや、ソフトウェアと様々な種類のハードウェアの間の仲介、そしてイメージキャプチャやサウンドの出力といった機能を提供するソフトウェアのモジュールを含ませることが出来ます。既にチュートリアル20で、exportメッセージを使った時にQuickTimeコンポーネントを使用しています。そしてこの後のいくつかのチュートリアルでもQuickTimeのコンポーネントをベースにしたJitterのオブジェクトを見ていきます。

最初のGrab

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


お好きなように捕まえて(Grab)ください

jit.qt.grabオブジェクトは、このオブジェクトが出力するマトリックスの横幅と高さを指定するために、2つのアーギュメント(320と240)をとります。これらのアーギュメントの値は、キャプチャしたデータが置かれる内部バッファの大きさ(ディメンション)も指定しています。マトリックスは常にプレーン数4、データタイプがcharのマトリックスです。

・getvdevlistと書かれたメッセージボックスをクリックしてください。このメッセージが送られると、jit.qt.grabオブジェクトは使用可能なビデオキャプチャデバイスを検索します。そしてjit.qt.grabオブジェクトの右アウトレットからvdevlistというシンボルに続く形で、見つかった全てのデバイスの名前がリストで出力されます。このパッチではiterを使用してリストの内容を分解し、ubumenuにデバイスの名前を項目として登録しています。私達の環境ではDV Videoしかリストに入りませんでした。リストの内容は人によって異なるでしょう。

ubumenuをクリックして使用したいデバイスを選択してください。選択すると、選択項目のインデックス番号がubumenuからvdevice $1メッセージボックスに出力され、どのビデオキャプチャデバイスが選択されたかをjit.qt.grabオブジェクトに伝えます(ubumenuの項目のインデックス番号と、jit.qt.grabの中のビデオキャプチャデバイス番号は同じになります)。コンポーネントを使う際にvdeviceを選択していないと、jit.qt.grabオブジェクトは標準でリストの一番最初にあるデバイスを使用します(これはvdevice 0メッセージを送ったのと同じ事になります)。

・openと書かれたメッセージボックスをクリックしてください。openメッセージが送られると、 jit.qt.grabオブジェクトは選択したビデオキャプチャデバイスからシーケンスを取得するコンポーネントの使用を開始します(実際はコンポーネントのインスタンスを作ります)。openメッセージを受信するまでにbangやoutputmatrixメッセージを受信すると、jit.qt.grabオブジェクトは最後に取得したマトリックスを出力し続けます。つまり、シーケンスの取得は行われません。

metroオブジェクトに繋がったトグルボックスをクリックして、jit.qt.grabオブジェクトへのbangの送信をスタートさせてください。今、jit.pwindowにはキャプチャされた信号が映っているはずです。

ビデオ信号を見ることが出来ない場合は、Maxウィンドウをチェックして、jit.qt.grabオブジェクトが何かエラーを報告していないかどうか確認してみてください。使用しようとしているデバイスが他のアプリケーションで使用中であったり、デバイスがスリープ状態になっている可能性もあります(例えば私達のビデオカメラは3分間操作をしないとスリープしてしまいます)。選択したデバイスが複数入力をサポートしている場合は、続きを読み進めてください。


・複数のデバイスをコンピューターに接続している場合、vdeviceアトリビュートを使ってそれらを切り替える事が出来ます。そしてこの切り替えはjit.qt.grabオブジェクトにopenメッセージを送った後でも可能です。

・コンポーネントの使用を停止するためにcloseと書かれたメッセージボックスをクリックしてください。すぐに使用するので、パッチは開いたままにしておいてください。

入力を切り替える

使用しているビデオキャプチャデバイスが何種類かの入力をサポートしているかもしれません。例えば、CapSure Cardはs-videoとコンポジットの入力をサポートしています。また、ATI Rage 128 Proはs-videoとコンポジット、さらにチューナー入力をサポートしています。FireWireのDVは通常一つの入力しかサポートしません。このセクションではそれらの入力をリストアップする方法と、それらを切り替える方法について見ていきます。

・openと書かれたメッセージボックスをクリックして、jit.qt.grabオブジェクトのコンポーネント使用を再びopenしてください。

・getinputlistと書かれたメッセージボックスをクリックしてください。このメッセージを受信すると jit.qt.grabオブジェクトは、選択したデバイスで使用可能な入力のリストを、右アウトレットからシンボルinputlistに続く形で出力します。このパッチではiterオブジェクトを使用してリストを分解し、パッチの右の方のubumenuに入力しています。

・一番右のubumenuをクリックして選択したデバイスで使用可能な入力のリストを見てみましょう。私達のDVカメラは、YUV component(DV)の一つの入力しか使えませんでした。私達のCapSure Cardは下のスクリーンショットにあるように、コンポジット入力とs-video入力が使えました。


デバイスの入力設定

・入力を切り替えるために、ubumenuで何か項目を選択してみましょう。選択すると、選択項目のインデックス番号がubumenuからinput $1メッセージボックスに出力されます。そしてどの入力が選択されたかをjit.qt.grabオブジェクトに伝え、入力が切り替わります(ubumenuの項目のインデックス番号と、 jit.qt.grabの中の入力の番号は同じになります)。コンポーネントを使うときに、はっきりとどの入力を使用するか選択していない場合、jit.qt.grabオブジェクトは標準でリストの一番最初にある入力を使用します(これはinput 0メッセージを送ったのと同じ事になります)。

・今、jit.pwindowには、選択した入力からキャプチャされたビデオ信号が表示されているはずです。

・以上が終わったら、closeと書かれたメッセージボックスをクリックしてコンポーネントの使用を停止してください。

jit.qt.grabの標準のモード(vmode 0、またはシーケンスグラバーモード)では正常に動作しないビデオキャプチャデバイスもあります。もしjit.qt.grabオブジェクトが不安定な動作を見せたら、vmode 1(vdigモード)というメッセージをjit.qt.grabに送ってみてください。何種類かのキャプチャデバイスではこの方法でビデオキャプチャの安定度が増します。

 

取得のクオリティ

ウェブカムを使用する場合に、jit.qt.grabオブジェクトは、標準的な処理モードで速くてクオリティの良い処理をします。しかし、他の、アナログのビデオキャプチャボードや、DVカメラの様な解像度の高いキャプチャデバイスを使用する場合には、デバイスを最大限に利用するために、シーケンス取得のクオリティ設定をしたいと思うことでしょう。


ソース、デスティネーション領域の指定をしたハイクオリティモード

・サブパッチp device_inputをダブルクリックして開いてください。開いたパッチャーウィンドウではvdeviceとinputの全ての設定をする事が出来ます。設定が終わったらサブパッチのウィンドウを閉じてください。

・openと書かれたメッセージボックスをクリックして、コンポーネントの使用を開始してください。 metroオブジェクトに繋がったトグルボックスをクリックしてください。今、jit.pwindowにはキャプチャされたビデオ信号が映っているはずです。

・ハイクオリティモードを使用するために、jit.qt.grabオブジェクトにvmode 2というメッセージを送る必要があります。vmode $1と書かれたメッセージボックスの上のナンバーボックスに数字の2を入力してください。使用しているキャプチャデバイスがハイクオリティモードをサポートしていれば、jit.pwindowに表示されているイメージが多少変化するはずです。

使用しているデバイスがハイクオリティモード(vmode 2)をサポートしていない場合は、表示されるイメージは変化しないか、イメージのバランスが壊れてしまったりノイズが入ってしまったりと、好ましくない結果になるかもしれません。このような場合は、シーケンス取得か、vdigモード(vmode 0とvmode 1)に戻して、このセクションの残りを飛ばしてください。

・他のクオリティモードと比較するために、キャプチャした信号をズームして細かく見てみましょう。usesrcrect $1と書かれたメッセージボックスのすぐ上のトグルボックスをクリックしてください。usesrcrect 1というメッセージが送られると、jit.qt.grabは入力信号のうちの指定した領域だけをキャプチャするようになります。この際の領域の指定はソース領域を設定するアトリビュートsrcrectで行います。secrectの初期値は入力信号のフレームの全域を取得するように設定されています。

・pak srcrect 0 0 320 240オブジェクトについているナンバーボックスの値を変えてみてください。ここでsrcrectアトリビュートを設定するメッセージが作られます。srcrectメッセージの各アーギュメントはそれぞれ入力信号の左端x座標、上端y座標、右端x座標、下端y座標を示しています。表示が変わって、入力信号の中の指定した部分だけが表示されているはずです。見栄えをよくするために、横と縦の比が4:3となるように設定してみてください。

・さていくつか比較してみましょう。まずvmodeの設定を、前に使っていた0か1の設定に戻してください(メモ:vmode 1(vdigモード)は特殊なキャプチャデバイスでしか使用しませんし、サポートもされていません)。イメージのクオリティをvmode 2(ハイクオリティモード)と比較してみてください。私達の環境では、DVカメラを使用していますが、イメージがひどく縮れてしまって、エイリアスのエッジが大量に発生しています。

ubumenuオブジェクトをクリックしてください。このオブジェクトにはvmode 2で可能なクオリティ設定のリストが入っています(この設定はvmode 2専用で、シーケンス取得やvdigモードの時には何の効果もありません)。ubumenuで何か項目を選択すると、その項目のインデックス番号がcodecquality $1のメッセージボックスを経て、jit.qt.grabオブジェクトに伝えられます。いくつかのクオリティ設定を試して、イメージのクオリティとフレームレート(jit.fpsguiオブジェクトに表示されています)、両方の変化を見てください。初期状態のcodecqualityはmaxに設定されています(jit.qt.grabオブジェクトにcodecquality maxかcodecquality 4のメッセージを送ったのと同じ状態です)。

実際にキャプチャをしてみて、自分の環境に最適な設定を調べた方が良いでしょう。例えば、vmode 2で、codecquality minとcodecquality lowのモードに設定してみると、私達の環境では事実vmode 0よりも劣化して見えます。vmode 2ではキャプチャのクオリティを完全にコントロールできますが、イメージのクオリティをjit.qt.grabの初期状態よりも改良することが必須という事にはならないでしょう。

・出力されるマトリックスの中で、キャプチャしたフレームが占める領域を指定することも出来ます。この領域はデスティネーション領域と呼ばれ、destrectアトリビュートで設定を行います。デスティネーション領域の設定を有効にするためにusedestrect $1のすぐ上のメッセージボックスをクリックしてください。初期状態では、デスティネーション領域の設定はjit.qt.grabオブジェクトから出力するマトリックスのディメンジョンと同じになっています(つまりマトリックス全体です)。

pak 0 0 320 240オブジェクトについたナンバーボックスの値を変えてみてください。srcrectメッセージのときと同じように、dstrectメッセージのアーギュメントはそれぞれ出力されるマトリックスの左端x座標、上端y座標、右端x座標、そして下端y座標を示しています。値を指定するとイメージが変化して出力されるマトリックスの中の指定した部分にだけイメージが映っているのが分かるでしょう。pakオブジェクトが
t
l clearオブジェクトに繋がっていることに注意してください。この仕組みでjit.qt.grabオブジェクトにdstrectメッセージを送る前にclearメッセージを送っています。このclearメッセージを送らないとどういうことになるかは、実際にそう設定する事で確かめることができるでしょう。

・以上が終了したら、closeと書かれたメッセージボックスをクリックしてコンポーネントの使用を停止してください。


ディスクに取得する

取得したシーケンスを直接QuickTimeムービーとしてディスクに記録していくことが出来ます。この設定をすると、jit.qt.grabオブジェクトは直接ハードディスクに記録していきます。そしてその際にはマトリックスの出力はされません。多少の違いはありますが、このプロセスはチュートリアル19で説明された中の一つに似ています。しかし、今回はサウンドも同時に記録する事が出来ます。

ハードディスクへの記録中は、AppleTalkやインターネットアプリケーションの様に、処理をさえぎるような設定やアプリケーションは使用しないようにしておいた方が良いでしょう。


映像をディスクに取得


ディスクに取得

今まで見てきたvmodeやsrcrect、dstrectといった設定の項目をp mode_rectサブパッチに入れてあります。それらを変更したいときにはこのサブパッチのオブジェクトボックスをダブルクリックすることでサブパッチを開く事が出来ます。しかし、vmodeアトリビュートの設定はディスクに取得する処理には何の意味も持ちません。

p device_inputサブパッチをダブルクリックして開いてください。パッチャーウィンドウでは、vdeviceとinputに必要な設定が全て出来るようになっています。設定を終えたら、サブパッチウィンドウを閉じてください。

・openというメッセージボックスをクリックしてコンポーネントの使用を開始してください。metroオブジェクトの上のトグルボックスをクリックしてください。jit.pwindowに選択した入力からのビデオ信号が表示されているはずです。

jit.qt.grabオブジェクトは初期状態で、そのwrite_videoアトリビュートがオン(1)の状態に設定されています。これを反映させて、このパッチではloadbangを使用してwrite_video $1の上のトグルボックスがオンの状態を示すようにしています。もしも、映像データの書き込みはしないで、サウンドのデータだけを書き込みたい場合には、jit.qt.grabオブジェクトにwrite_video 0メッセージと、write_audio 1メッセージを送ることになります。今回は、write_audio $1の上のトグルボックスはそのままオフの状態にしておいてください(初期状態でwrite_audioアトリビュートの設定はオフになっています)。

・write grabfile.mov 15. jpeg normalと書かれたメッセージボックスをクリックしてください。おそらく、このメッセージがjit.qt.recordオブジェクトに記録をスタートをさせるメッセージに似ている事に気づくでしょう。jit.qt.grabオブジェクトのwriteメッセージは、timescaleアーギュメントに関する設定以外はjit.qt.recordオブジェクトのwriteメッセージと同じフォーマットをとります。grabfile.movはファイル名、15.は出力されるムービーのフレームレート、jpegはPhoto-JPEG codecを、そしてnormalはcodecのクオリティを指定しています。全てのアーギュメントはオプションです。ファイル名を省略すればファイルダイアログボックスが開きます。残りの設定に関しても、省略すれば前回使用した値が使われます。もし1度目の使用であれば、キャプチャデバイスの初期設定の値が使用されることになります。

テクニカルな詳細:jit.qt.grabオブジェクトのwriteメッセージのフォーマットには大きな特徴があります。それは、映像のデータとサウンドのデータを別々のファイルに記録する設定が出来ることです。詳しくはオブジェクトリファレンスのjit.qt.grabの項目か、ヘルプパッチを参照してください。

・writeメッセージを送るとすぐに記録が始まります。ここで、記録中はjit.qt.grabオブジェクトは一切のマトリックスを出力しません。そのことはjit.fpsguiが変化しなくなることで分かります。記録の最中にマトリックスを出力するかどうかは、write_previewアトリビュートで設定することが出来ます。初期状態ではこのwrite_previewアトリビュートの設定はオフ(0)になっています。write_preview $1のメッセージボックスの上のトグルボックスをクリックして、記録中のマトリックスを出力するようにしてください。記録はwrite_previewがオフの状態の方がよりスムーズに行われるでしょう。

・stopと書かれたメッセージボックスをクリックしてディスクへの記録を停止してください。パッチは開いたままにしておいてください。

jit.qt.grabオブジェクトは記録が正常に行われたかを確認するために、記録が終わると右アウトレットからメッセージを出力します。このパッチではprintオブジェクトをこのアウトレットに繋いであるので、Maxウィンドウでその結果を見ることが出来ます。正常に記録が完了すると、Maxウィンドウにはprint: write grabfile.mov 1と表示されているはずです。

先ほど説明した方法でサウンドをディスクに記録することも出来ます。jit.qt.grabで使用するサウンドデバイスを選択するには2つの方法があります。

1.snddeviceとsndinputメッセージを使ってサウンドデバイスと、サウンドデバイスの入力を設定することが出来ます。この方法はビデオデバイスとその入力の設定方法とよく似ています。使用可能なそれぞれの項目を取得するには、getvdevlistとgetinputlistメッセージの代わりにgetsnddevlistとgetsndinputlist メッセージを使用します。

2.MacOSのサウンド設定ダイアログボックスを使用してデバイスとインプットに関する全ての設定を一度に行う事が出来ます。

このチュートリアルではサウンド設定ダイアログボックスを使用します。もう一つのメッセージを使用する方法も自分で作ってみると良く理解できるでしょう。その際にはp device_inputサブパッチが良い参考になるでしょう。

ビデオデバイスとその入力を設定するために、ビデオ設定ダイアログボックスもあります。これは jit.qt.grabオブジェクトにsettingsメッセージを送ると画面上に現れます。

・snd_settingsと書かれたメッセージボックスをクリックしてください。サウンド設定ダイアログボックスが現れます。ポップアップメニューや他の設定を使って好みのサウンド入力を好みに設定してください。OKをクリックしてダイアログボックスを閉じてください。

・write_audio $1と書かれたメッセージボックスについたトグルボックスをクリックしてディスクへのサウンドの記録が出来るようにしてください。

・write grabfile+snd.mov 15. jpeg normalと書かれたメッセージボックスをクリックしてください。前回と同じようにすぐに記録が開始されます。今回はサウンドも記録されているでしょう。

・stopと書かれたメッセージボックスをクリックして、記録を停止してください。ハードディスクから音が一緒に録れているかどうか確認するために、今作成したムービーを探してQuickTimeプレイヤーで再生してみてください(お好みならMaxでも)。

・closeと書かれたメッセージボックスをクリックしてコンポーネントの使用を停止してください。

サウンドとビデオそれぞれの設定ダイアログボックスについて詳しく調べると、それらには明度、彩度、音量といったような、多くの設定のオプションがある事が分かるでしょう。このチュートリアルの範囲を越えてしまいますが、これらの全ての設定値はMax/Jitter上で直接変更することが可能です。より詳しく知りたい場合は、オブジェクトリファレンスのjit.qt.grabの項目か、ヘルプパッチを参照してください。


まとめ

jit.qt.grabオブジェクトはQuickTime互換のビデオ入力デバイスからイメージを取得する事が出来ます。このオブジェクトを使用すると、Maxパッチ上での方法とダイアログボックスを開く方法の2つの方法で、デバイスとその入力をリストにしそれらを切り替える事や、イメージのクオリティを制御する事が出来ます。srcrectとdstrectアトリビュートは、キャプチャしたイメージを切り取ってJitterマトリックス上に配置するのに使用します。jit.qt.grabオブジェクトを使用して、映像やサウンドをQuickTimeムービーとして直接ディスクに記録する事も出来ます。