線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2457
推到 Plurk!
推到 Facebook!

DirectShow列舉攝影機之問題

答題得分者是:ikk
doriscat
一般會員


發表:4
回覆:10
積分:2
註冊:2003-11-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-09-03 10:01:38 IP:59.127.xxx.xxx 訂閱
各位好,在下是利用http://www.cppfans.com/d_sdk/victordx9sdk.asp 內所提供的方式進行DirectShow的程式
參考的範例是AMCap以及http://blog.csdn.net/aoosang/archive/2005/05/26/381148.aspx 裡的方式做攝影機的列舉
以下為AMCap所拮取拿到新的project使用的CODE
HRESULT hr;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// enumerate all video capture devices
ICreateDevEnum *pCreateDevEnum=0;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if(hr != NOERROR)
{
//ErrMsg(TEXT("Error Creating Device Enumerator"));
return;
}
IEnumMoniker *pEm=0;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
if(hr != NOERROR)
{
// ErrMsg(TEXT("Sorry, you have no video capture hardware.\r\n\r\n")
// TEXT("Video capture will not function properly."));
//goto EnumAudio;
}
pEm->Reset();
ULONG cFetched;
IMoniker *pM;
while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
{
IPropertyBag *pBag=0;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(SUCCEEDED(hr))
{
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"Description", &var, 0);
if(hr == NOERROR)
{
Ansistring str = var.bstrVal;
}
pBag->Release();
}
pM->Release();
}
pEm->Release();

此部分的Code在AMCap執行時 str會有字串輸出 USB 2.0 A/V Converter
但在新開的Project執行時
hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
回傳值不為0, 因此 str沒有輸出字串

假設我把 hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);修改
則AMCap與新的Project的str都會輸出
MSScreen encoder DMO
WMVideo9 Encoder DMO
MSScreen 9 encoder DMO

請問在新的Project是否有什麼地方須做修改,才能正確讀取到列舉的攝影機名稱 USB 2.0 A/V Converter
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-09-04 08:42:53 IP:140.116.xxx.xxx 訂閱
這個有去修改嗎?

④ enum: M$ 的 enum 类型一般都做 int 类型处理, 而 Borland 会根据取值范围按照 char,short,或 long 处理,
这样会因为期望的 sizeof 不同而引起程序出错。

解决方法:
Project→Options→Compiler, 需要选中 Compiling 里面的 Treat enum type as ints.
------
FPGA驗證, FPGA開發平台, http://smims.com
doriscat
一般會員


發表:4
回覆:10
積分:2
註冊:2003-11-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-09-04 09:12:34 IP:59.127.xxx.xxx 訂閱
ikk你好,依你所說的方式做設定,此問題已經解決
謝謝你~~
系統時間:2024-04-19 23:27:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!