/**/

チュートリアル 21:
ライブ映像とオーディオ入力の使用

このチュートリアルでは、Jitterを使って、ウェブカム、DVカメラ、PCIビデオカードなどのQuickTimeと互換性のあるイメージキャプチャデバイスと連携し、映像のシーケンスを入力してマトリックスとして使用したり、直接ディスクに録画したりする方法ついて説明します。Jitterを使って、サウンドを直接 QuickTimeムービーとしてディスクに録音することも可能です。

このチュートリアルのパッチの例では、QuickTime互換のイメージキャプチャデバイスの電源がオンになっていて、コンピュータに接続されていることを前提としています。

Windows ユーザのための注:jit.dx.grab オブジェクトは jit.qt.grabオブジェクトと同じような多くの機能を提供します。主な違いはオブジェクトが DirectX 互換デバイスでネイティブに動作し、QuickTime VDIG を必要としないという点です。より詳しい情報は、リファレンスや jit.dx.grab オブジェクトのヘルプパッチを参照してください

シーケンス取得(映像入力)の基本

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

jit.qt.grab オブジェクトは、QuickTimeコンポーネントの中の1つに対応するインターフェイスを提供します。コンポーネントは QuickTime で用いられている一般的なメカニズムで、これを利用することによってオブジェクトの機能を拡張しています。コンポーネントには、ソフトウェアのモジュールを組み込むことができ、このモジュールによって、新しいビデオコーデックとのインターフェイス、ソフトウェアと様々な種類のハードウェア間のインターフェイス、イメージキャプチャやサウンドの出力などの機能が提供されます。すでにチュートリアル20で export メッセージを使った際にQuickTimeコンポーネントを使用しています。そしてこの後のいくつかのチュートリアルでもQuickTimeコンポーネントに基づいたJitterオブジェクトを見ていきます。

最初の取得

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


望みどおりに捕まえて(grab)ください

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

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

ubumenu をクリックして使用したいデバイスを選択して下さい。これによって、 vdevice $1と書かれたメッセージボックスは、選択されたビデオキャプチャデバイスのインデックス(これは、ubumenuの中の位置と同じものです)を jit.qt.grab に送信します。明示的に vdevice を選択していない場合、jit.qt.grab オブジェクトは、デフォルトでリストの最初にあるデバイスを使用します(これは vdevice 0 メッセージを送った場合と同じです)。

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

metro オブジェクトに接続された toggle をクリックして、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は通常1つの入力しかサポートしません。このセクションではこれらの入力のリストを作成し、入力の切り替えを行なう方法について見ていきます。

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

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

・最も右にある ubumenuをクリックして、選択したデバイスで使用可能な入力のリストを見てみましょう。私たちのDVカメラは、YUV component(DV) という1つの入力しか使えないと報告されました。また、CapSure Card はコンポジット入力とs-video 入力が使用できると報告されました。下のスクリーンショットはそれを示しています。


デバイスの入力設定

・入力の切り替えを行なうために、ubumenuから項目を選択して下さい。これによって、input $1と書かれたメッセージボックスは選択された入力のインデックス(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 オブジェクトに接続された toggle をクリックして下さい。これで jit.pwindow に(選択した入力から)キャプチャされたビデオ信号が表示されるはずです。

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

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

・他のクオリティモードや設定と比較するために、キャプチャした信号をズームして細かく見てみましょう。usesrcrect $1と書かれたメッセージボックスに接続された toggle をクリックして下さい。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 mincodecquality lowのモードに設定すると、vmode 0よりも劣化して見えます。vmode 2 ではキャプチャのクオリティを完全にコントロールできますが、必ずしも jit.qt.grab のデフォルトの設定よりイメージのクオリティが改善するとは限りません

・出力されるマトリックスの中でキャプチャしたフレームが占める領域を指定することもできます。この領域はデスティネーション領域と呼ばれ、destrect アトリビュートで設定を行います。デスティネーション領域の設定を有効にするために、usedestrect $1 と書かれたメッセージボックスに接続された toggle をクリックして下さい。デフォルトでは、デスティネーション領域の設定は 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で説明したもののうちの1つと同様なものです。しかし、ここではオーディオも同時にレコーディングしています。

ハードディスクへのレコーディング中は、処理に割り込みをかけるアプリケーションは終了させ、設定は使用不可にしておく必要があります。割り込みをかけるものとしては、AppleTalk や インターネットアプリケーションなどがあります。

映像をディスクに取得


ディスクに取得

今まで見てきた vmodesrcrectdstrect といった設定の項目は p mode_rect というサブパッチにカプセル化されています。これらの項目を変更したい場合には、このオブジェクトボックスをダブルクリックしてアクセスすることができます。ただし、vmode アトリビュートの設定はディスクに取得する処理には影響を与えないことを覚えておいて下さい。

p device_input というサブパッチをダブルクリックして下さい。vdeviceinput の設定に必要な項目が揃ったパッチャーウィンドウが開きます。設定を終えたらサブパッチウィンドウを閉じて下さい。

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

jit.qt.grab オブジェクトは、デフォルトでは write_video アトリビュートがオン(1)の状態に設定されています。この状態を表示するために、このパッチでは write_video $1と書かれたメッセージボックスに接続された toggleloadbang によってオンにしています。映像データの書き込みを行なわずに、サウンドデータだけを書き込みたい場合には、jit.qt.grab オブジェクトに write_video 0 メッセージと、write_audio 1メッセージを送信します。ここでは、write_audio $1と書かれたメッセージボックスに接続されている toggle はオフのままにしておいて下さい(デフォルトでは、write_audio アトリビュートはオフ(0)に設定されています)。

write grabfile.mov 15. jpeg normalと書かれたメッセージボックスをクリックして下さい。このメッセージが、 jit.qt.record オブジェクトに送信してレコーディングを開始させる write メッセージに似ていることに気がついたでしょう。jit.qt.grab オブジェクトの write メッセージは、timescale アーギュメントに関する設定を除いて、jit.qt.record オブジェクトの write メッセージと同じフォーマットになっています。grabfile.mov はファイル名、15. は出力されるムービーのフレームレート、jpegはPhoto-JPEG コーデック(codec)、normal はコーデックのクオリティを指定するものです。全てのアーギュメントはオプションになっていて、ファイル名を省略した場合には、ファイルダイアログボックスが表示されます。他の設定が省略された場合は、前回の値が使用されます。初めて使用使用する場合には、キャプチャデバイスのデフォルトの値が使用されることになります。

技術的な詳細:ビデオデータとサウンドデータを分離して、別々のファイルにレコーディングしようと考えている場合には、jit.qt.grab オブジェクトの write メッセージのフォーマットには重要な相違点があります。詳しくはオブジェクトリファレンスの jit.qt.grab の項目、あるいはヘルプパッチを参照して下さい。

writeメッセージを送信すると、すぐにレコーディングが開始されます。レコーディングを行なっている間、 jit.qt.grab オブジェクトはマトリックスを出力しません。これは jit.fpsgui が変化しなくなることでわかります。レコーディングの最中にマトリックスを出力するかどうかは、write_preview アトリビュートで設定することができます。デフォルトではこのwrite_preview アトリビュートの設定はオフ(0)になっています。write_preview $1 というメッセージボックスに接続された toggle をクリックして、レコーディング中でもマトリックスを出力するように設定して下さい。レコーディングは write_preview がオフの状態のままのほうがスムーズに行われます。

・stopと書かれたメッセージボックスをクリックしてディスクへのレコーディングを停止して下さい。パッチは開いたままにしておいて下さい。

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

同様な方法でサウンドをディスクにレコーディングすることもできます。jit.qt.grab で使用するサウンドデバイスの選択には2つの方法があります。

  1. snddevicesndinput というメッセージを使って、サウンドデバイスとサウンドデバイスの入力を設定することができます。この方法はビデオデバイスとその入力を設定する方法とよく似ています。使用可能なそれぞれの項目を取得するためには、getvdevlistgetinputlist メッセージの代わりに getsnddevlistgetsndinputlist メッセージを使用します。

  2. MacOSのサウンド設定ダイアログボックスを使用してデバイスと入力に関する全ての設定を一度に行うことができます。

このチュートリアルではサウンド設定ダイアログボックスを使用しますが、サンプルパッチをコピーして、メッセージを使った方法を実験してみると良く理解できるでしょう。その場合には、p device_inputサブパッチを参考にして下さい。

これと同様に、ビデオ設定ダイアログボックスを利用して、ビデオデバイスとその入力の設定を行なうことができます。 このダイアログボックスを表示させるためには、 jit.qt.grab オブジェクトに settings メッセージを送信します。

snd_settings と書かれたメッセージボックスをクリックして下さい。サウンド設定ダイアログボックスが表示されます。ポップアップメニューや他のコントロールを使って、サウンド入力設定を調整して下さい。OKをクリックしてダイアログボックスを閉じて下さい。

write_audio $1と書かれたメッセージボックスに接続された toggle をクリックして、ディスクへのオーディオレコーディング処理が実行できるように設定して下さい。

write grabfile+snd.mov 15. jpeg normalと書かれたメッセージボックスをクリックして下さい。前回と同じように、すぐにレコーディングが開始されます。今回はサウンドもレコーディングされているはずです。

stopと書かれたメッセージボックスをクリックして、レコーディングを停止させて下さい。映像と共にサウンドがレコーディングされているかどうかを確認するために、作成したムービーをハードディスクから探してQuickTimeプレイヤーで(あるいはMaxで)再生してみて下さい。

closeと書かれたメッセージボックスをクリックしてコンポーネントとの接続を閉じて下さい。

サウンドとビデオの設定ダイアログボックスを調べてみると、それぞれ、デバイスごとに、明度、彩度、音量といった入力設定のためのオプションが数多くあることに気がつくと思います。これらのパラメータは、すべてMax/Jitterから直接設定することが可能ですが、その説明はこのチュートリアルの範囲を越えてしまいます。より詳しい情報は、オブジェクトリファレンスの jit.qt.grab の項目、あるいはヘルプパッチを参照して下さい。

まとめ

jit.qt.grab オブジェクトはQuickTime互換のビデオ入力デバイスからイメージを取得することができます。このオブジェクトを使用すると、Max から、あるいはダイアログボックスによるインターフェイスを通じて、デバイスとその入力のリストの作成、デバイスや入力の切り替え、イメージのクオリティの制御を行なうことができます。srcrectdstrect アトリビュートを使って、キャプチャしたイメージを切り取り、Jitterマトリックス上に配置することができます。また、jit.qt.grab オブジェクトは、映像やサウンドをQuickTimeムービーとしてディスクに直接レコーディングすることもできます。