Skip to main content.

Monday, March 19, 2007

DirectShowの開発環境

DirectShowとは、Microsoftの技術でWindowプラットフォームでビデオ、オーディオ等を扱うアーキテクチャー、APIのことです。ベースになる技術は.NETではなくCOMです。ということは、今後どうなっていくのかは分かりません。まあ、今後どうなるのかはともかく、私自身は少しですが以前に開発実績があるので、現状の開発環境はどうなっているのかやってみました。

現状、DirectShowは、前回のMicrosoft Platform SDKに含まれています。以前は、DirectXに含まれていました。そうすると、前回のようにMicrosoft Platform SDKの環境を設定すればいいようですが、どうもVC++でコンパイルするためには、結局はDirectXが必要になってくるようです。ということで、DirectXは現時点では以下が最新でしょうか。
DirectX SDK(February 2007)

これで、Microsoft Platform SDKとDirectX SDKがインストール出来れば、VC++で開発するためには、インクルードファイル、ライブラリファイルの設定が必要になって来ます。以下のようになるでしょうか。それぞれ、Microsoft Platform SDKのインストール先と、DirectX SDKのインストール先です。設定する場合は、各自のインストール先に読み替えて設定して下さい。

VC++でのインクルードファイルのディレクトリ
C:\Program Files\Microsoft Platform SDK\Include
C:\Program Files\Microsoft DirectX SDK (Feb 2007)\Include
場合によっては以下のディレクトリも必要になる場合があるかと思います。
C:\Program Files\Microsoft Platform SDK\(以下続き)
    Samples\Multimedia\DirectShow\BaseClasses
VC++でのライブラリファイルのディレクトリ
C:\Program Files\Microsoft Platform SDK\Lib
場合によっては以下のディレクトリも必要になる場合があるかと思います。
C:\Program Files\Microsoft DirectX SDK (Feb 2007)\Lib\x86
VC++でのライブラリファイル(DirectShow)
strmiids.lib
VC++でのライブラリファイル(Win32関連で設定されていない場合は要設定)
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib

以上までで、DirectShowの開発環境が出来たかと思います。以下は参考までにVC++での動作確認用の簡単なプログラムです。しっかりCOMベースのプログラムです。単純に動画ファイルを再生しています。内容はともかく、コンソールアプリケーションベースですので、コンソールアプリケーションのプロジェクトを作成してコピー等すれば単純な動作確認になるかと思います。その場合は、正しく動画ファイルのパスを設定して下さい。ファイルがないと単純に動かないです。動画ファイルはDirectShowのサンプルに入っていたものです。一応こちらに置いておきます。
//
// DirectShowテスト用プログラム
//

//VC++ 2005の場合でとりえあえずwarningを無効にする
//(warningがいろいろと出ると見にくいので)
#pragma warning( disable : 4819 )
#pragma warning( disable : 4996 )

//DirectShowのインクルード
#include <dshow.h>

//動画ファイルの場所を指定(短いパス名の方が無難かも)
#define	MOV_FILENAME L"C:\\temp\\ruby.avi"

int main(int argc, char** argv)
{
    IGraphBuilder *pGraphBuilder;
    IMediaControl *pMediaControl;

    //COM初期化
    CoInitialize(NULL);

    //FilterGraph生成
    CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,
        IID_IGraphBuilder,(LPVOID *)&pGraphBuilder);

    //MediaControlインターフェース取得
    pGraphBuilder->QueryInterface(IID_IMediaControl,
        (LPVOID *)&pMediaControl);

    //ファイルがない場合は、画面が出ないだけなので、要注意
    //pMediaControl->RenderFile((BSTR)MOV_FILENAME);
    //2007.03.20 IGraphBuilderの方を使用に変更
    pGraphBuilder->RenderFile((BSTR)MOV_FILENAME,NULL);

    //再生開始
    pMediaControl->Run();

    //再生終了前に終了しないように停止
    MessageBox(NULL,(LPCSTR)"stop",(LPCSTR)"stop",MB_OK);

    //解放
    pMediaControl->Release();
    pGraphBuilder->Release();

    //COM終了
    CoUninitialize();

    return 0;
}

Windowsプログラミング関連記事