Feeds:
文章
留言

Archive for 十月 23rd, 2008

IVideoWindow 介面用來設定視訊視窗的屬性,其中 FullScreenMode 屬性設為 true 則會以全螢幕方式呈現。

以下是切換到全螢幕呈現的程式片段

CComQIPtr<IVideoWindow> m_pVW = pGraphBuilder;
m_pVW->put_FullScreenMode(OATRUE);

CComQIPtr<IMediaControl> m_pMC = pGraphBuilder;
// 啟動
m_pMC->Run();

參考資料
[1] MSDN, "IVideoWindow Interface"

Read Full Post »

之前的程式我都偷懶使用一個無權空迴圈來觀看執行結果。實際上,DirectShow 有一個 IMediaEvent 介面可用來接收媒體的相關事件。

其中 WaitForCompletion( msTimeout, pEvCode) 可用來等待視訊執行結束。

如果要等待影片執行完成,可用如下的程式

CComQIPtr<IMediaEvent> pMediaEvent = pGraphBuilder;
long eventCode;
pMediaEvent->WaitForCompletion(INFINITE, &eventCode);       

如果你只希望他執行 10 秒就結束,修改 timeout 時間
pMediaEvent->WaitForCompletion(10000, &eventCode);       

參考資料
[1] MSDN, "IMediaEvent::WaitForCompletion"
[2] MSDN, "IMediaEvent Interface"

Read Full Post »

因為 Webcam 屬於一個設備,沒有辦法使用"利用 DirectShow 播放音訊和視訊"所提到的 RenderFile。因此,對於這種設備就需要使用 ICaptureGraphBuilder2.RenderStream()。

另外,我要如何知道那個輸入設備是要 Render,一個方法是透過列舉給使用者選擇,我的範例假設只有一個視訊輸入設備。

下面是我的測試範例

 

#include "stdafx.h"
#include <rpcsal.h>
#include <dshow.h>
#include <iostream>

#pragma comment(lib, "strmiids.lib")

using namespace std;

int main(){
    ::CoInitialize(NULL);
    {
        CComPtr<IGraphBuilder> pGraphBuilder;
        pGraphBuilder.CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER);

        CComPtr<ICaptureGraphBuilder2> m_pCapture; 
        m_pCapture.CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC);
    
        // Filter 和 Capture 進行連接 
        m_pCapture->SetFiltergraph(pGraphBuilder); 

        // 列舉設備 
        CComPtr<ICreateDevEnum> pCde;         
        pCde.CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC);

        CComPtr<IEnumMoniker> pEm;
        pCde->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);

        CComPtr<IMoniker> pM; 
        ULONG cFetched; 
        CComPtr<IBaseFilter> pBf; 
        if(pEm->Next(1, &pM, &cFetched)==S_OK) {
            //設備聯接 
            pM->BindToObject(0,0,IID_IBaseFilter, (void**)&pBf); 
            pM.Release(); 
        } else { 
            // 沒有 Webcam 設備
            return 0; 
        } 

        //將設備添加到graph 
        pGraphBuilder->AddFilter(pBf, L"Video Capture"); 

        // 連接一個源插口 
        m_pCapture->RenderStream(
            &PIN_CATEGORY_PREVIEW,
            &MEDIATYPE_Video,
            pBf,
            NULL,
            NULL
        );         
        
        CComQIPtr<IMediaControl> m_pMC = pGraphBuilder; 

        // 啟動
        m_pMC->Run();

        while(1){
            ::Sleep(1000);
        }
    }
    ::CoUninitialize();    
    return 0;
}

參考資料
[1] MSDN, "ICaptureGraphBuilder2 Interface"
[2] MSDN, "ICreateDevEnum Interface"

Read Full Post »