○DirectXMediaの準備
前回の本文中でも取り上げましたが、VideoForWindowsに代わるマルチメディアAPIにDirectShowがあります。DirectShowはDirectXと呼ばれる従来のWindowsAPIとは別系統でハードウェアをドライブするAPI群の1つです。
DirectXはWindowsでリアルタイムなゲームをする用途などで以前から知られていましたが、最新のDirectXはハード寄りの機能をもつDirectXFoundationとアプリケーション寄りな機能をもつDirectXMediaに分けられ、最新版はDirectXFoundation:バージョン7a、DirectXMedia:バージョン6と、バージョン番号からもずいぶん進歩してることが判ります。
DirectShowはDirectXMediaのなかの動画を扱うAPI群です。DirectXMediaの開発ツールであるDirectXMediaSDKは以前はマイクロソフトのWebサイトからダウンロードできたようですが、現時点ではDirectX7aのCDROMに付属して提供されます。このCDROMはマイクロソフトのWebサイトから申し込み用紙を入手してFAXすればメディア代と送料程度で購入できます。
DirectX7aのCDROMのインストーラからDirectXMediaのインストールを選択すればDirectXMediaの開発環境が準備されDirectShowを使ったアプリケーションの開発が可能になります。DirectX7aのインストーラ画面を図1、DirectXの概要を図2に示します。
<図1 DirectX7a CDROM>dx7a.bmp
<図2 DirectXの構成>zu2.bmp
○DirectShow
DirectShowはマイクロソフトの説明を借りれば、「マルチメディア データのストリーミング処理をコントロールするDirectX Media のメディア ストリーミング アーキテクチャ」ということです。
特徴的なことは「フィルタグラフ」と呼ばれる機構を使うことで、まるで電子回路のブロックを組み合わせるように、ストリームの処理が行えることです。このフィルタグラフを管理するブロックはフィルタグラフマネージャと呼ばれるコンポーネントです。このコンポーネントに別のフィルタのコンポーネントを追加することで、様々な処理を追加できます。
DirectShowにはこれらのフィルタグラフ関係のコンポーネントの他にフィルタグラフマネージャをさらにアプリケーションに近い形でまとめた「WindowsMediaPlayerコントロール」も提供されます。このコントロールのVBでの利用は当然ですが、HTMLのスクリプトから呼び出すこともできますので、動画が再生できるWebページも簡単に記述できます。まさに名前のとうりメディアプレーヤをコントロールとして張り込めるわけです。
これらのDirectShowの構成を図3に示します。
<図3 DirectShowの構成>zu3.bmp
○フィルタグラフマネージャを使う
フィルタグラフを体感していただくために最も簡単なサンプルプログラムをリストAに
示します。フィルタグラフをはじめDirectShowの各APIはCOMとして作られているため利用するには各コンポーネントの初期化、インターフェースの取得、という手順になります。リストAではプログラムを簡単にするため最低限のインターフェースしか使用していなく、実は再生の終了もアプリケーション側に通知されません。ですがVFWなどと比べるとよりシンプルな記述で動画の再生が実現できることが判ります。
フィルタグラフなど各コンポーネントに用意されているインターフェースはVCのツールの「OLE View」で確認する事ができます。フィルタグラフのインターフェースを一覧している様子を図4に示します。
図4 OLE VeiwでFilterGrephを見るzu4fg.bmp
リストA
//
// 簡単なDirectShow(FilterGraphクラス)のテスト , dx8版
// ○コンソールアプリケーションで作成
// ○[プロジェクト][設定][C/C++]
// [プリプロセッサ][インクルードファイルのパス]に
// c:\mssdk\includeを追加
// (c:\mssdkにSDKをインストールした場合)
// ○[プロジェクト][設定][リンク]
// [一般][オブジェクト/ライブラリモジュール]に
// c:\mssdk\lib\strmiids.lib を追加
// (c:\mssdkにSDKをインストールした場合)
//
#include <windows.h>
#include <string.h>
#include <dshow.h> // DirectShowの様々な準備
#include <conio.h> // getch()用
#include <stdio.h>
// インターフェース用のポインタ
IGraphBuilder * pigb = NULL;
IMediaControl * pimc = NULL;
void main(int ac, char *av[])
{
WCHAR filename[ MAX_PATH ];
HRESULT hr;
if( ac != 2 )
return;
CoInitialize(NULL);
// ファイル名の変換
MultiByteToWideChar( CP_ACP, 0, av[1], -1, filename, MAX_PATH );
// FilterGraphの初期化
hr = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pigb);
if (SUCCEEDED(hr))
{
// インターフェースを得る
pigb -> QueryInterface( IID_IMediaControl, (void**)&pimc );
// 再生するファイルを指定
hr = pigb -> RenderFile( filename, NULL );
if (SUCCEEDED( hr ))
{
// 再生
pimc -> Run();
printf("再生中です、再生終了後どれかキーを押して下さい");
getch();
}
}
// FilterGraphの開放
if ( pigb )
pigb -> Release();
if ( pimc )
pimc -> Release();
CoUninitialize();
return ;
}
図 リストAの実行画面
○フィルタグラフエディタツールを使う
DirectShowには各フィルタの動作をチェックするためにフィルタグラフエディタと呼ばれるツールが付属しています。このツールにはDumpというストリームデータをそのままバイナリデータとしてファイルに書き出すフィルタのサンプルも用意されています。
このツールでDumpフィルタを組み込んで利用すれば、緊急避難的な方法ですが、
DirectShowを使ったプログラムを書かずにVFWでは読めなかったType1形式のDV-AVIファイルが解凍できることになります。
図5はフィルタグラフエディタにDumpフィルタを組み込み、Type1形式のDV-AVIファイルを16ビットカラーの非圧縮ファイルに変換するグラフの様子です。図5中のプロパティウィンドウの表示でわかるようにDV-AVIをDumpフィルタでダンプする場合、
DVそのもののデータ形式に近い色差を計算した16ビットカラーのファーマットでダンプされます。
<図5 FilterGraphEditorの実行画面>zu5fge.bmp
パソコンによる動画計測とその周辺
/ 1.動画処理のための準備 / VFWく
VFW,プログラム2