生活随笔
收集整理的這篇文章主要介紹了
Directshow 视频捕捉入门篇 二
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
下面的代碼來結束如何選擇一個視頻捕捉設備,就是我們平常說的攝像頭
選擇一個視頻捕捉設備(Select capture device)
如何選擇一個視頻捕捉設備,可以采用系統設備枚舉,詳細資料參見Using the System Device Enumerator 。enumerator可以根據filter的種類返回一個設備的monikers。Moniker是一個com對象,可以參見IMoniker的SDK。
對于捕捉設備,下面兩種類是相關的。
CLSID_AudioInputDeviceCategory 音頻設備
CLSID_VideoInputDeviceCategory 視頻設備
?
下面的代碼演示了如何枚舉一個視頻捕捉設備
Cpp代碼??
ICreateDevEnum?*pDevEnum?=?NULL;?? IEnumMoniker?*pEnum?=?NULL;?? ?? ?? HRESULT?hr?=?CoCreateInstance(CLSID_SystemDeviceEnum,?NULL,?? ??????????????????????????????CLSCT_INPROC_SERVER,?IID_ICreateDevEnum,??? ??????????????????????????????reinterpret_cast<void**>(&pDevEnum));?? ?? if(SUCCEEDED(hr))?? {?? ?????? ????hr?=?pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,??? ????????????????????????????????????????&pEnum,?0);?? }??
?
IEnumMoniker接口pEnum返回一個IMoniker接口的列表,代表一系列的moniker,你可以顯示所有的設備,然后讓用戶選擇一個。
采用IMoniker::BindToStorage方法,返回一個IPropertyBag接口指針。然后調用IPropertyBag::Read讀取moniker的屬性。下面看看都包含什么屬性:
1 FriendlyName 是設備的名字
2 Description 屬性僅僅適用于DV和D-VHS/MPEG攝象機,如果這個屬性可用,這個屬性更詳細的描述了設備的資料
3DevicePath 這個屬性是不可讀的,但是每個設備都有一個獨一無二的。你可以用這個屬性來區別同一個設備的不同實例
下面的代碼演示了如何顯示遍歷設備的名稱 ,接上面的代碼
Cpp代碼??
HWND?hList;??????????? IMoniker?*pMoniker?=?NULL;?? while(pEnum->Next(1,?&pMoniker,?NULL)?==?S_OK)?? {?? ????IPropertyBag?*pPropBag;?? ????hr?=?pMoniker->BindToStorage(0,?0,?IID_IPropertyBag,?(void**)(&pPropBag));?? ????if(FAILED(hr))?? ????{?? ????????pMoniker->Release();?? ????????continue;????????? ????}?? ????VARIANT?varName;?? ????hr?=?pPropBag->Read(L"Description",?&varName,?0);?? ????if(FAILED(hr))?? ????{?? ????????hr?=?pPropBag->Read(L"FriendlyName",?&varName,?0);?? ????}?? ????if(SECCEEDED(hr))?? ????{?? ?????????? ????????USES_CONVERSION;?? ????????(long)SendMessage(hList,?LB_ADDSTRING,?0,?(LPARAM)OLE2T(varName.bstrVal));?? ????????VariantClear(&varName);?? ????}?? ?? ????pPropBag->Release();?? ????pMoniker->Release();?? }??
?
如果用戶選中了一個設備調用IMoniker::BindToObject為設備生成filter,然后將filter加入到graph中。
Cpp代碼??
IBaseFilter?*pCap?=?NULL;?? hr?=?pMoniker->BindToObject(0,?0,?IID_IBaseFilter,?(void**)&pCap);?? if(SECCEEDED(hr))?? {?? ????hr?=?m_pGraph->AddFilter(pCap,?L"Capture?Filter");?? } ?
為了創建可以預覽視頻的graph,可以調用下面的代碼:
Cpp代碼??
ICaptureGraphBuilder2?*pBuild;???????? ?? ...?? IBaseFilter?*pCap;???????????????????????????????????? hr?=?pBuild->RenderStream(&PIN_CATEGORY_PREVIEW,?&MEDIATYPE_Video,?? ????????????????????????????????????????????????pCap,?NULL,?NULL); ?
未完,待續。。。。。哈哈,如有問題可以聯系我:QQ:1906733710,我是從事電子簽到軟件、電子白板、互動投影軟件、查詢軟件開發的,現在要開發視頻錄制的功能,在對Directshow 研究的過程當中。希望一起研究提高。有需要軟件的也可以聯系我。
總結
以上是生活随笔為你收集整理的Directshow 视频捕捉入门篇 二的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。