zoukankan      html  css  js  c++  java
  • DirectShow控制台输出和保存视频设备名称

    #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();
    }

  • 相关阅读:
    蓝桥杯省赛经验
    阅读笔记四
    阅读笔记二
    阅读笔记一
    动态规划——Maximum Sum of 3 Non-Overlapping Subarrays
    动态规划——Remove Boxes
    动态规划——Dungeon Game
    动态规划——Freedom Trail
    动态规划——Frog Jump
    《软件需求十步走》阅读笔记一
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6751561.html
Copyright © 2011-2022 走看看