2013年5月10日金曜日

msdnのサンプルコードを実行してみる

msdn->DirectShow ->ファイルの再生法


win32コンソールアプリケーションで空のプロジェクトを作成する。

ソースファイルに新しい項目c++ファイルを追加する。

ファイルの再生法 のページの下の方のサンプルコードをコピーする。
再生するファイル名の所は動画ファイルが保存されている場所に変更する。\(エスケープ文字)に注意

このまま実行してもエラーが出る。


1>------ ビルド開始: プロジェクト: win32Console001, 構成: Debug Win32 ------
1>  main.cpp
1>main.obj : error LNK2001: 外部シンボル "_IID_IMediaEvent" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_IMediaControl" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_CLSID_FilterGraph" は未解決です。
1>main.obj : error LNK2001: 外部シンボル "_IID_IGraphBuilder" は未解決です。
1>c:\users\xxxx\documents\visual studio 2010\Projects\win32Console001\Debug\win32Console001.exe : fatal error LNK1120: 外部参照 4 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

プロジェクトのプロパティーの設定をする。


DirectShow->ファースト ステップ ガイド->ビルド環境の設定 を読んで、

Dshow.hを読み込んだ時に必要になるライブラリを設定する。




Strmiids.lib
Quartz.lib

ビルドして実行する。

参考

空のCLRプロジェクトで作成した場合エラーは出ないが、
HRESULT hr = CoInitialize(NULL);
の部分で失敗しますので、
共通言語ランタイムサポートの設定を
共通言語ランタイムサポートを使用しない に変更する。


CLRプロジェクトでは、すでにランタイムで呼び出されている。ので
別スレッドで対応する、
http://msdn.microsoft.com/ja-jp/library/ms164416.aspx
共通言語ランタイムサポートを使いたい場合は。
COM ライブラリの初期化 が失敗した時の操作をコメントアウトする
#include 

HRESULT hr = CoInitialize(NULL);

void main(void)
{
    IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;

    // COM ライブラリを初期化する。
    HRESULT hr = CoInitialize(NULL);
    //if (FAILED(hr))
    //{
    //    printf("ERROR - Could not initialize COM library");
    //    return;
    //}

    // フィルタ グラフ マネージャを作成し、インターフェイスを問い合わせる。
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                        IID_IGraphBuilder, (void **)&pGraph);
    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
        return;
    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    // グラフを作成する。 重要 : この文字列をシステム上のファイルに置き換える。
    hr = pGraph->RenderFile(L"G:\\sampleMovie\\sample.wmv", NULL);
    if (SUCCEEDED(hr))
    {
        // グラフを実行する。
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            // 完了するまで待機する。
            long evCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);

            // 注 : 実際のアプリケーションでは INFINITE を使用しないこと。
            // 無期限にブロックする場合がある。
        }
    }
    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();
}


0 件のコメント:

コメントを投稿