日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Directshow 视频捕捉入门篇 二

發布時間:2024/3/26 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;??
  • ??
  • //Create?the?system?device?enumerator??
  • 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;?????????//Handle?to?the?list?box??
  • 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;???????//Skip?this?one,?maybe?the?next?one?will?work??
  • ????}??
  • ????VARIANT?varName;??
  • ????hr?=?pPropBag->Read(L"Description",?&varName,?0);??
  • ????if(FAILED(hr))??
  • ????{??
  • ????????hr?=?pPropBag->Read(L"FriendlyName",?&varName,?0);??
  • ????}??
  • ????if(SECCEEDED(hr))??
  • ????{??
  • ????????//Add?it?to?the?application's?list?box??
  • ????????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;??????//Capture?Graph?Builder??
  • //Initialize?pBuild(not?shown)??
  • ...??
  • IBaseFilter?*pCap;??????????????????????????????????//Video?capture?filter??
  • hr?=?pBuild->RenderStream(&PIN_CATEGORY_PREVIEW,?&MEDIATYPE_Video,??
  • ????????????????????????????????????????????????pCap,?NULL,?NULL); ?


  • 未完,待續。。。。。哈哈,如有問題可以聯系我:QQ:1906733710,我是從事電子簽到軟件、電子白板、互動投影軟件、查詢軟件開發的,現在要開發視頻錄制的功能,在對Directshow 研究的過程當中。希望一起研究提高。有需要軟件的也可以聯系我。

    總結

    以上是生活随笔為你收集整理的Directshow 视频捕捉入门篇 二的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。