在枚举设备时,首先初始化COM库并设置并发模式;代码为
HRESULT hr=CoInitializeEx(NULL, COINIT_APARTMENTTHREADED| COINIT_DISABLE_OLE1DDE);
调用媒体功能初始化函数;代码为
hr = MFStartup(MF_VERSION);
创建要获取的属性;代码为
IMFAttributes *pAttributes = NULL;
hr = MFCreateAttributes(&pAttributes, 1);
设置要获取属性的GUID,获取视频设备名,代码为
hr = pAttributes->setGUID
(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
获取音频设备名,代码为
hr = pAttributes->setGUID
(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID);
然后枚举设备,代码为
hr = MFEnumDeviceSource(pAttributes, &m_ppDevices, &m_cDevices);
其中IMFActivate ** m_ppDevices;预先定义。
然后析构属性,代码为
SafeRelease(&pAttributes);
其中SafeRelease函数为
template <class T> void SafeRelease(T **ppT)
{if(*ppt){(*ppt)->Release();}
*ppT = NULL;
}
读取设备名列表
此时设备名列表已经保存在m_ppDevices中,
通过索引获取设备名,取第一个设备时,代码为
*ppActivate = m_ppDevices[0];
(*ppActivate)->AddRef();
其中,**ppActivate = &(WCHAR* szName);
将szName中的WCHAR变成char,即完成了设备名获取过程。
参考csdn:https://docs.microsoft.com/en-us/windows/win32/api/mfapi/nf-mfapi-mfstartup