基于DirectShow获取音频视频输入设备列表

开发工具:

Visual Studio v2010

Windows SDK v7.1

版本历史:

V1.0 2010年10月09日

  • 完成正式版本。

功能描述:

获取音频视频输入设备列表

 

接口函数:

DS_GetAudioVideoInputDevices

 

下载地址:

DS_AudioVideoDevices.zip

源代码:

DS_AudioVideoDevices.h

/* ---------------------------------------------------------- 文件名称:DS_AudioVideoDevices.h 作者:秦建辉 MSN:[email protected] 版本历史: V1.0 2010年10月09日 完成正式版本。 功能描述: 获取音频视频输入设备列表 接口函数: DS_GetAudioVideoInputDevices ------------------------------------------------------------ */ #pragma once #include <windows.h> #include <vector> #include <dshow.h> #ifndef MACRO_GROUP_DEVICENAME #define MACRO_GROUP_DEVICENAME #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; #endif #ifdef __cplusplus extern "C" { #endif /* 功能:获取音频视频输入设备列表 参数说明: vectorDevices:用于存储返回的设备友好名及Moniker名 guidValue: CLSID_AudioInputDeviceCategory:获取音频输入设备列表 CLSID_VideoInputDeviceCategory:获取视频输入设备列表 返回值: 错误代码 说明: 基于DirectShow 列表中的第一个设备为系统缺省设备 capGetDriverDescription只能获得设备驱动名 */ HRESULT DS_GetAudioVideoInputDevices( std::vector<TDeviceName> &vectorDevices, REFGUID guidValue ); #ifdef __cplusplus } #endif     

DS_AudioVideoDevices.cpp

#include "DS_AudioVideoDevices.h" #pragma comment(lib, "Strmiids.lib") HRESULT DS_GetAudioVideoInputDevices( std::vector<TDeviceName> &vectorDevices, REFGUID guidValue ) { TDeviceName name; HRESULT hr; // 初始化 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( guidValue, &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 ); // 获取设备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(); return hr; }    

你可能感兴趣的:(基于DirectShow获取音频视频输入设备列表)