● ToolBox API徒然草(2003/09/10)

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

 〜 FireWire経由でビデオ映像を出力する 〜


以前、「FireWire経由でビデオ映像を取り込む」という題目で、QuickTimeのSequence Graberと呼ばれるモジュールの解説をしました。今回は、その逆の操作である「FireWire経由でビデオ映像を出力する」を、Video Output Componentsと呼ばれるモジュールを用いて実現します。ハードディスクに保存されているDVフォーマットのMovieファイルをウィンドウ上に再生し、その映像と音声をFireWire経由でビデオ機器へ出力する仕組みを解説します。まずは、FireWire接続されたビデオ機器の電源が入っていることを確認してください。そうしないとエラーを返してくるAPIがありますので注意しましょう。

最初に、FindNextComponent()でVideo Output Componentを見つけ、GetComponentInfo()によりその情報を調べることで、それがFireWire経由であるかどうかをチェックしておきます。OKであれば、OpenComponent()を使い、見つけておいたコンポーネントをオープンします。Video Output Componentには、「どんな種類の映像を出力するのか?」を決定するために、Display Modeと呼ばれるパラメータセットが複数用意されています。例えば、最近のFireWireを装備したMacintoshには「Apple FireWire NTSC」「Apple FireWire PAL」「Apple FireWire DVCPRO NTSC」「Apple FireWire DVCPRO PAL」の4つのDisplay Modeが存在しています。

どんなDisplay Modeがあるのかを調べるために、QTVideoOutputGetDisplayModeList()でそれが含まれているコンテナ(QTAtomContainer)を抽出して解析します。まず最初に、QTCountChildrenOfType()によりコンテナ内にいくつのDisplay Modeがあるのかを調べ(kQTVODisplayModeItemという指標のQTAtomとして保存されている)、ひとつでも存在していることが確認できたら、その内容を解析するためにgetFirstLevelAtoms()ルーチンを呼び出します。



発見したDisplay Modeの内容は、以下のDisplayMode構造体に取り込むことにします。getFirstLevelAtoms()は、コンテナからDisplay Modeが含まれているアトム(QTAtom)を見つけ、それをgetSecondLevelAtoms()に渡すことで、映像の縦横ピクセルサイズ、縦横解像度、秒間フレーム数、圧縮タイプ、モード名称をDisplayMode構造体に保存します。Display Modeの解析の結果、コーデックタイプが'dv 'で、映像の縦サイズが480ピクセル(NTSC)であれば、QTVideoOutputSetDisplayMode()にアトムのID番号を渡して、それを採用します。



Video Output ComponentsのオープンとDisplay Modeの設定が完了したら、続いてビデオ出力対象のMovieをsetMovieVideoOutput()ルーチンでセットします。対象となるMovieファイルは、DVフォーマットで録画されたものに限りますので注意してください。最初に、GetMovieTrackCount()でMovieにサウンドトラック(MediaHandler)があるかどうかをチェックしておきます。もしあれば、後でそれも出力対象とします。

QTVideoOutputBegin()でコンポーネントの使用開始を指示し、SetMovieVideoOutput()でビデオ出力対象となるMovieを指定します。Movie再生をビデオ出力だけでなくウィンドウでも行なうには、ComponentFunctionImplemented()にkQTVideoOutputSetEchoPortSelectを渡した後、TVideoOutputSetEchoPort()で再生させるウィンドウのCGrafPtrをセットします。続いて、先程得ておいたMediaHandlerを、MediaSetSoundOutputComponent()に代入してサウンド出力先も決定します。

後は、設定済みのMovieをStartMovie()などを使い再生させてやれば、それと同じ映像と音声がFireWire経由でビデオ機器に出力されることになります。



最後は、Video Output Componentによる作業を終了する時に実行するexitVideoOutput()ルーチンです。設定済みのMovieの再生をストップさせてから、SetMovieVideoOutput()にNULLを渡して出力対象から外します。その後、QTVideoOutputEnd()とCloseComponent()を実行してビデオ出力の機能を停止させます。Video Output Componentを利用している最中は、Sequence Graber(ビデオ入力機能)は利用できませんので、交互にビデオ入力と出力を行うようなアプリケーションではコンポーネントの切り替えが必要になります。注意してください。



今回用いたVideo Output Componentsに属するAPIが定義されているUniversal Interfacesは、QuickTimeComponents.hです。QuickTimeのAPIを利用する場合には、アプリケーションのプロジェクトに「QuickTime Framework」を追加し、ソースファイルの先頭では以下の定義を忘れないでください。

#include <Quicktime/QuickTime.h>

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

http://developer.apple.com/documentation/QuickTime/RM/TransportDelivery/VidOutComp/index.html

また、Video Output Componentsを利用した「SimpleVideoOut」というサンプルソースコードが以下のサイトに登録されています。ぜひ参考にしてみてください。

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

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