Sequence Grabberによるビデオ・サウンドキャプチャ

FOO: few01%at%mac.com (%at%を@に書き換え)
2002/2/6

Sequence Grabber with Carbon


目次:
1. シーケンスグラッバとは
2. 使い方の流れ
3. シーケンスグラッバのオプション
4. カーボンイベントハンドラとシーケンスグラッバ
5. 新しい関数
6. 世界最小のCarbonビデオキャプチャプログラム


1. シーケンスグラッバとは

Mac OSで、ビデオキャプチャやサウンドキャプチャをするにはシーケンスグラッバ(以下SGと略する)を使う。一連の流れ(シーケンス)をつかみ取る(グラッブ)から、Sequence Grabberというのだろう。SGはQuickTimeの一部で、それだけでも膨大な関数群がある。これを使うと、コンポジット入力なのか、マイク入力なのか、FireWireなのか、MPEGなのか、DVなのかなど多様な設定を考えずに大概のキャプチャをやってくれる極めて便利な関数群である。


2. 使い方の流れ

使い方は次の4ステップで構成される。

(1) 初期化
(2) チャンネル設定
(3) ループ
(4) 終了処理

(1) 初期化
 初期化では、SGを定義し、初期化関数を呼び出し、オフスクリーンの描画領域に結びつける。まず空っぽのコンポーネント(OpenDefaultComponent)としてSGを定義する。次にSGInitializeを使って初期化する。そしてSGSetGWorldで、SGをオフスクリーンの描画領域(GWorld)に結びつける。

(2) チャンネル設定
 チャンネル設定も初期化作業の一つではあるが、ちょっとやることが多いのでわけた。
 SGはキャプチャデータを管理するのだが、どこから入ってくるのかは、チャンネルコンポーネントが扱う。SGも実際はシーケンスグラッバコンポーネントで、コンポーネントの一種である。チャンネルコンポーネントは、シーケンスグラッバチャンネルコンポーネントというのが本当の名前で、ビデオや音が入ってくるところの管理をする。いろいろな入力があり得るので、それを管理する専用のコンポーネントが用意されているのだ。
 まずSGNewChannelで、チャンネルを作る。その時、videoMediaTypeを指定するとビデオ、soundMediaTypeを指定すると音のチャンネルになる。次にSGSetChannelBoundsでビデオチャンネルの画面サイズを指定する。そしてSGSetChannelUsageで、そのチャンネルをどう使うかを指定する。seqGrabPreviewだと、プレビューのみ、seqGrabRecordだと録画もやる。

(3) ループ
 SGStartPreviewもしくはSGStartRecordでSGの起動をする。その後はフレームレート以上のタイミングでSGIdleを呼ぶ(例えば1秒間に60回)。SGIldleを呼ぶと、SGは一回のキャプチャ作業をする。
 再生中、もしくは録画中に、ポーズをさせるにはSGPause、アップデートイベントが発生したらSGUpdateを呼んで処理を促す。

(4) 終了処理
 終わるには、SGStopを使う。その後CloseComponentでSGを閉じる。


3. シーケンスグラッバのオプション
 
SGには、膨大なオプションがある。あまりに多すぎて、全部は紹介できないが、重要なオプションを以下に示す。

オプション1:
 SGSettingsDialogは、ビデオキャプチャやサウンドキャプチャの設定ダイアログを表示する関数

オプション2:
 SGSetMaximumRecordTimeは、録画最大時間を指定する関数

オプション3:
 SGSetDataProcは、データ関数というものを仕込むために使う。データ関数とは、ムービーデータが書き込まれる度に呼ばれるユーザ定義の関数である。単に録画するのではなく、いろいろな処理を加えたいときに使う。例えば、画面にフレームレートや時間を表示したりするのに使う。
 同じようなことを実現するのにSGSetVideoBottolenecksというのもある。どう違うのかは、分かっていない。
 

4. カーボンイベントハンドラとシーケンスグラッバ

シーケンスグラッバは、Carbonができる前からあるので、これまではいわゆる普通の処理がなされていた。イベントを受け付ける場合もWaitNextEventを使う。Carbonでは、より進んだCarbon Event Handlerという仕組みが用意されているので、それを使うのが望ましい。

Carbon Event Handlerでシーケンスグラッバを使うには、
・タイマーイベントを使ってSGIdleを呼び出す
・各種イベント発生時に、SGの処理を加える
という大きく二つの処理を加えてやれば良い。

タイマーイベントはフレームレート以上(例えば1/60)で立ち上がるようにして、コールバック関数の中でSGIdleを呼び出すのだ。

各種イベント、例えばウィンドウの移動などの時に、SGを何もしないとうまく動かないので、SGUpdateなどを適時呼んで変なことがおこらないようにする。アプリケーション終了時にSGStop, CloseComponentなどをちゃんと呼ぶのも重要だ。

以上の処理のサンプルプログラムがある。それはSGDataProcSamplePB.projのSonOfMungGrab.cである。

5. 新しい関数

シーケンスグラッバには、QuickTimeがバージョンアップするときに、新しい関数が付け加わることがある。それら新しい関数の中で、その中でよく使われているものを紹介する。

SGSetDataRef
 古くは、チャンネルをseqGrabRecordにしたら、ムービーファイルへの録画しかできなかったのが、録画先をメモリにしたり、録画せずにプレビューのみにしたり自由に変更できるようになった。このSGSetDataRefを使って制御する。
 
SGNewOutput, SGSetChannelOutputなど
 古くは、ビデオとサウンドは同じファイルにしか保存できなかった。それを複数のファイルにバラバラに保存できるようになった。それらをサポートする関数群である。
 
SGSetOutputNextOutputなど
 同じ内容を、複数のファイルに同時書き込みできるようになった。その機能をサポートする関数群。
 

6. 世界最小のCarbonビデオキャプチャプログラム

Carbon + Nibベースの、ビデオキャプチャプログラムを作った。エラーハンドリングは一切していない。以下からダウンロードできる。Project Builderでビルドし、DV CamをFireWireでつないで起動すれば、映像と音のプレビューができる。

simpleSG.sit  

(c) few01@mac.com --[2002/2/6]--