DirectShow控制台输出和保存视频设备名称
2015-07-20 17:20
369 查看
#include "windows.h" #include "TCHAR.h" #include <dshow.h> #include <vector> #include <iostream> #include <cwctype> #define MAX_FRIENDLY_NAME_LENGTH 128 #define MAX_MONIKER_NAME_LENGTH 256 typedef struct _TDeviceName { WCHAR FriendlyName[MAX_FRIENDLY_NAME_LENGTH]; // 设备友好名 WCHAR MonikerName[MAX_MONIKER_NAME_LENGTH]; // 设备Moniker名 } TDeviceName; int _tmain(int argc, _TCHAR* argv[]) { TDeviceName name; HRESULT hr; // 初始化 std::vector<TDeviceName> vectorDevices; vectorDevices.clear(); // 初始化COM hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (FAILED(hr)) { return hr; } // 创建系统设备枚举器实例 ICreateDevEnum *pSysDevEnum = NULL; hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum); if (FAILED(hr)) { CoUninitialize(); return hr; } // 获取设备类枚举器 IEnumMoniker *pEnumCat = NULL; hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0); if (hr == S_OK) { // 枚举设备名称 IMoniker *pMoniker = NULL; ULONG cFetched; while (pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(NULL, NULL, IID_IPropertyBag, (void **)&pPropBag); if (SUCCEEDED(hr)) { // 获取设备友好名 VARIANT varName; VariantInit(&varName); hr = pPropBag->Read(L"FriendlyName", &varName, NULL); if (SUCCEEDED(hr)) { StringCchCopy(name.FriendlyName, MAX_FRIENDLY_NAME_LENGTH, varName.bstrVal); std::wcout << name.FriendlyName << std::endl; // 获取设备Moniker名 LPOLESTR pOleDisplayName = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH * 2)); if (pOleDisplayName != NULL) { hr = pMoniker->GetDisplayName(NULL, NULL, &pOleDisplayName); if (SUCCEEDED(hr)) { StringCchCopy(name.MonikerName, MAX_MONIKER_NAME_LENGTH, pOleDisplayName); vectorDevices.push_back(name); } CoTaskMemFree(pOleDisplayName); } } VariantClear(&varName); pPropBag->Release(); } pMoniker->Release(); } // End for While pEnumCat->Release(); } pSysDevEnum->Release(); CoUninitialize(); }
相关文章推荐
- Java中的继承和组合
- iOS文本高度计算
- 总结CSS3新特性(Transform篇)
- wince数据库操作类
- POj3268 Silver Cow Party
- **android Intent 的Componet ,Action ,Category,Data,Type,Extra,Flag 7种属性详解
- 超酷!这些事也可以用Google做
- poj 2395 最小生成树的最大边
- javascript动画中的“帧”
- DTCMS插件的制作实例电子资源管理(一)插件目录结构
- 如何将sqlserver表中的数据导出sql语句或生成insert into语句 [转]
- Tomcat8+redis做session同步
- 用java语言编写一个类,使该类包含一个方法f(),该方法具有可以输出同时带有大小写两种形式英文字母表的功能。
- ThreadLocal用法与实现原理
- [NOIP2014]寻找道路
- android中各种Intent跳转(邮件、音频、联系人....)
- Shell编程入门总结(编辑器Vim篇)
- Stripies
- HTML5学习笔记简明版(4):新元素之video,audio,meter,datalist,keygen,output
- 图片切割方法