Feeds:
文章
留言

Archive for 2008 年 10 月

之前的程式我都偷懶使用一個無權空迴圈來觀看執行結果。實際上,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 »

使用 IGraphBuilder 和 IMediaControl 介面可以簡單的播放任何音訊和視訊檔案,以下是播放 mp3 的程式 ^^

#include "stdafx.h"
#include <rpcsal.h>
#include <dshow.h>
#pragma comment(lib, "strmiids.lib")
int _tmain(int argc, _TCHAR* argv[]){ ::CoInitialize(NULL);


{ CComPtr<IGraphBuilder> pGraphBuilder; CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraphBuilder ); CComPtr<IMediaControl> pMediaControl; pGraphBuilder->QueryInterface(IID_IMediaControl, (void **)&pMediaControl); // 建立 the filter graph pGraphBuilder->RenderFile(L"c:\02.mp3", NULL); // 播放媒體 pMediaControl->Run(); while(1){ ::Sleep(1000); }

} ::CoUninitialize(); return 0; }

如果你要播放 avi, wmv 等視訊,只要將程式的 mp3 檔改成你系統中的 avi 視訊檔名即可。不同的是因為我沒有設定呈現的 Window 所以會出現如下的視窗播放影片

image

參考資料
[1] MSDN, "IGraphBuilder Interface"
[2] MSDN, "IMediaControl Interface"

Read Full Post »

如果你要使用 DirectShow 而引入了 dshow.h,編譯時卻產生"error C2061: syntax error : identifier ‘__RPC__deref_out_opt’" 錯誤訊息

可在 dshow.h 之前引入 rpcsal.h

Read Full Post »

看到別人介紹 MSN 的狀態也可以賺錢(也不知道能不能賺到一包泡麵的錢),
我也去申請了一個,以後看到我狀態列,記得多點幾下 開懷大笑
申請網址如下,推薦人記得填我 cwchiu ~ 感謝

狀態廣告

Read Full Post »

聽了 3 個小時的內容,幾個比較感興趣的重點紀錄一下

1. 完整支援 Unicode
從專案名稱、程式單元和路徑都支援,程式碼也可以使用 Unicode 作為變數或 Class Name,雖然這個部份著墨很多,可是變數取中文我覺得不切實際,路徑用中文可能實際一些。

2009 為了支援 Unicode,提供了 UnicodeString 這個新型別,並且預設字串都使用這個型別。字元預設都採用 WideChar。使用 Unicode 會對程式的執行速度和體積造成一些影響,2009 對 UnicodeString 效能的改善使用 Reference Count 處理字串,執行的效率比 WideString 快,因為 WideString 為了支援 BSTR,所以處理上沒有使用 Reference Count,所以效能不及 UnicodeString。

這部份我的疑問是,UnicodeString 如何與 AnsiString, WideString, BSTR, std::string, std::wstring, char, wchar, … 等型別進行轉換,UnicodeString 的字元要如何處理?

a. UnicodeString 有提供 c_str() / t_str() / w_str() 回傳 wchar_t*,再來就用傳統的轉換方式即可
b. UnicodeString 建構子支援 AnsiStringT<codepage>, WideString, char*, wchar_t*
b. WideString 建構子支援 UnicodeString

至於字元的處理,不能直接透過指標,必須使用 2009 提供的相關函數或類別。 字串編碼轉換可用 ConvUtils 類別。

相關參考
[1] 峪飞鹰, "现有 Delphi 项目迁移到 Tiburon 中的注意事项 (上)"
[2] 峪飞鹰, "现有 Delphi 项目迁移到 Tiburon 中的注意事项 (中)"
[3] 峪飞鹰, "现有 Delphi 项目迁移到 Tiburon 中的注意事项 (下)"
[4] 峪飞鹰, "Tiburon 支持 Unicode 的 LoadFromFile, SaveToFile"
[5] 峪飛鷹, "Delphi 2009 (Tiburon) 新特性之 Unicode 支持!"
[6] stanleyxu, "Unicode 隨想"

2. C++0x 支援
僅支援幾個比較確定的功能。如:alignof, decltype, delete default, nullptr, static_assert, char_16t, char_32t

3. Precompile Wizard
可用於分析目前專案哪些 header file 常用且不易變動,產生 pch2.h,用於提高編譯速度。

4. 支援 JSON

5. 內建預先編譯好的 boost 1.35 和 ACE 函數庫

6. C++ Builder 未來方向

64 位元開發、多核心、多執行緒,對於 .NET 支援可能沒這麼快(也可能不會支援)~ 

備註:這2009 版本的 Help 還是寫的很 #!@#$%^&*&

Read Full Post »

親愛的好朋友們,最近終於陸續將取得的照片整理完畢
我已經在今天將相關的網址寄給各位,希望我沒有遺漏任何一個人
若是你尚未收到相關照片的信件,煩請告訴我一聲,並告訴我你的 Mail ….. 感謝~開懷大笑

未來照片更新不吝通知,請自行到 http://cwcwebapp.appspot.com 查詢

補充:
結婚新秘是 Joanne人真的很不錯,如果造型或時間需要會自己加人但不會增加費用
人也隨和風趣,造型設計完畢之後也會攝影,事後也會壓製光碟給你做計念
我答應幫她宣傳一下,如果喜歡她所設計的造型,可利用下面的資訊聯絡上她
Blog: http://tw.myblog.yahoo.com/blog-joanne/
MSN: mbfafa@hotmail.com
地址:台南市西門路二段262號
手機:0913-526789
工作室:06-2294577

Read Full Post »

« Newer Posts