● ToolBox API徒然草(2003/02/14)

  このニュースは、MOSAの会員にのみ配布されているデベロッパー向けの
  デジタルマガジンMOSADeNのに掲載された記事です。ほぼ一ヶ月遅れで
  ここに掲載されて行きます

 〜 FireWire経由でビデオ映像を取り込む 〜


「FireWire経由でビデオ映像を取り込む」と書くと、なにやら非常に難しい処理を実行しなければいけないように思われます。しかし、実際には、QuickTimeに属するSequence Graberと呼ばれるモジュール(Component)を利用することで、非常に簡単にこうした処理を実現することが可能なのです。今回は、FireWire経由でビデオ映像と音声を取り込み、DVフォーマット(もしくは別フォーマット)のMovieファイルとしてハードディスクに保存する手順を解説してみます。

まず最初に、720X480ピクセルのウィンドウをオープンしておきます。ここにビデオ映像が表示されることになります。アプリケーションに「表示」と「録画」アイテムを持ったビデオメニューを用意します。「表示」をトグルすることでビデオ表示のON/OFFを行います。ビデオ表示がONの状態で「録画」を選択すると、ビデオ録画(Movieファイルへの保存)が開始され、ウィンドウ上でのマウスクリックにより録画を終了します。

enterVideo()はアプリケーションの起動時に実行する「録画準備」用ルーチンです。逆に、exitVideo()はアプリケーションの終了時に呼び出し、利用したSequence Graber Componentを閉じます。OpenDefaultComponent()は、FireWire経由のビデオ映像取り込み用Componentをオープンします。別の(USB経由とか)映像&音声取り込み用Componentをオープンしたい場合には、FindNextComponent()で適切なComponentを見つけてから、OpenComponent()を実行する必要があるでしょう。SGInitialize()でComponentを初期化し、SGNewChannel()で映像と音声のチャンネルを別々に用意したら、SGSetChannelUsage()にseqGrabPreviewを代入し、チャンネルの利用形態として「プレビュー」(録画せず表示のみ)を選択しておきます。



得られたComponentやチャンネルへのリファレンスは、「v_theSG」「v_gVideoChannel」「v_gSoundChannel」の3つの外部変数に保存されます。ビデオカメラなどの映像機器がFireWireに接続されていない状態でenterVideo()を呼ぶと、エラーが返ることがありますので注意してください。

ビデオメニューから「表示」が選択されたら、switchVideo()ルーチンを実行します。この時のビデオ表示ON/OFF状態は、外部変数の「v_switch」に保存されます。startVideo()は、SGPrepare()でプレビューの準備をした後、SGStartPreview()を実行してウィンドウ上にビデオ映像の表示を開始します。setVideoRect()は、表示対象となるウィンドウのCGrafPortとその矩形枠をSequence Graberに伝えています。その逆に、stopVideo()はSGStop()を実行してプレビューを中止します。プレビュー処理で注意する点は、Sequence Graber用の処理時間を配分するために、SGIdle()を定期的に呼ぶ必要があることです。そのため、アプリケーション開始時に、idleVideo()を定期的に呼ぶCarbon Event Timerルーチンをインストールしておきます。スムーズな映像表示を実現するためには、0.001秒程度の短い間隔でのTimerルーチン呼び出しをお勧めします。



ビデオメニューから「録画」が選択されたら、recordVideo()ルーチンを実行します。recordVideo()の引き数には、録画済みMovieファイルの保存場所を指示するためにFSSpecを渡します。SGSetChannelUsage()を再度呼び出し、利用形態としてseqGrabPreviewだけでなくseqGrabRecord(録画)を追加します。SGSetDataOutput()でMovieファイルの保存場所を指示し、SGPrepare()による録画準備が完了したら、SGStartRecord()を実行して録画を開始します。その後、TrackMouseLocation()によりユーザのマウスクリックを関知したら、SGStop()により録画を終了します。録画が終了し時点で、SGSetChannelUsage()で各チャンネルの利用形態をプレビューへ切り替えてから、SGStartPreview()でプレビューを再開します。ちなみに、録画中にも定期的にSGIdle()を呼ばないといけないのですが、これについてはTrackMouseLocation()からもTimerルーチンが呼ばれているので、心配する必要はありません。



では、保存するMovieファイルの圧縮フォーマットやフレームレイトなどを変更したい場合にはどうしたら良いのでしょうか?そうした用途には、SGSettingsDialog()を利用します。以下のsetChannelInfo()ルーチンは、引き数がゼロならば映像用、それ以外ならば音声用の読み込みパラメータ設定ダイアログを表示します。



  
  ビデオ映像の録画オプション

  
  サウンドの録音オプション

当然、こうした録画用の設定はexitVideo()によりディフォルトに戻ってしまいます。しかし、SGGetChannelSettings() APIを利用すれば、ダイアログによる設定内容を得ることが可能です。このデータを初期設定ファイルに保存しておいてSGSetChannelSettings()で戻してやれば、いつでも好みの設定でビデオ映像と音声を録画できます。興味が有る方はチャレンジしてみてください。

Component ManagerとSequence Graberに属するAPIが定義されているUniversal Interfacesは、Components.hとQuickTimeComponents.hです。QuickTime APIを利用する場合には、プロジェクトへ「QuickTime Framework」を追加し、ソースファイルの先頭で以下の定義を行うことを忘れないでください。

#include <Quicktime/QuickTime.h>

QuickTimeに関する最新技術資料は、以下のサイトにまとめられています。

http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/newsframe.htm

また、QuickTimeに関する各種サンプルソースコードは以下のサイトに登録されていますので、ぜひ参考にしてみてください。

http://developer.apple.com/samplecode/Sample_Code/QuickTime.htm

copyright 2003 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp