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



摘自:秦建辉的专栏

个人独立博客:http://www.firstsolver.com/wordpress/


开发工具:

Visual Studio v2010

Windows SDK v7.1

版本历史:

V1.0 2010年10月09日

  • 完成正式版本。

功能描述:

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

 

接口函数:

DS_GetAudioVideoInputDevices

 

下载地址:

DS_AudioVideoDevices.zip

源代码:

DS_AudioVideoDevices.h

[cpp] view plain copy print ?
  1. /* ---------------------------------------------------------- 
  2. 文件名称:DS_AudioVideoDevices.h 
  3.  
  4. 作者:秦建辉 
  5.  
  6. MSN:[email protected] 
  7.  
  8. 版本历史: 
  9.     V1.0    2010年10月09日 
  10.             完成正式版本。 
  11.  
  12. 功能描述: 
  13.     获取音频视频输入设备列表 
  14.  
  15. 接口函数: 
  16.     DS_GetAudioVideoInputDevices 
  17.  ------------------------------------------------------------ */  
  18. #pragma once  
  19.   
  20. #include   
  21. #include   
  22. #include   
  23.   
  24. #ifndef MACRO_GROUP_DEVICENAME  
  25.     #define MACRO_GROUP_DEVICENAME  
  26.   
  27.     #define MAX_FRIENDLY_NAME_LENGTH    128  
  28.     #define MAX_MONIKER_NAME_LENGTH     256  
  29.   
  30.     typedef struct _TDeviceName  
  31.     {  
  32.         WCHAR FriendlyName[MAX_FRIENDLY_NAME_LENGTH];   // 设备友好名  
  33.         WCHAR MonikerName[MAX_MONIKER_NAME_LENGTH];     // 设备Moniker名  
  34.     } TDeviceName;  
  35. #endif  
  36.   
  37. #ifdef __cplusplus  
  38. extern "C"  
  39. {  
  40. #endif  
  41.   
  42. /* 
  43. 功能:获取音频视频输入设备列表 
  44. 参数说明: 
  45.     vectorDevices:用于存储返回的设备友好名及Moniker名 
  46.     guidValue: 
  47.         CLSID_AudioInputDeviceCategory:获取音频输入设备列表 
  48.         CLSID_VideoInputDeviceCategory:获取视频输入设备列表 
  49. 返回值: 
  50.     错误代码 
  51. 说明: 
  52.     基于DirectShow 
  53.     列表中的第一个设备为系统缺省设备 
  54.     capGetDriverDescription只能获得设备驱动名 
  55. */  
  56. HRESULT DS_GetAudioVideoInputDevices( std::vector &vectorDevices, REFGUID guidValue );  
  57.   
  58. #ifdef __cplusplus  
  59. }  
  60. #endif  
/* ---------------------------------------------------------- 文件名称:DS_AudioVideoDevices.h 作者:秦建辉 MSN:[email protected] 版本历史: V1.0 2010年10月09日 完成正式版本。 功能描述: 获取音频视频输入设备列表 接口函数: DS_GetAudioVideoInputDevices ------------------------------------------------------------ */ #pragma once #include #include #include #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 &vectorDevices, REFGUID guidValue ); #ifdef __cplusplus } #endif     

DS_AudioVideoDevices.cpp

[cpp] view plain copy print ?
  1. #include "DS_AudioVideoDevices.h"  
  2.   
  3. #pragma comment(lib, "Strmiids.lib")  
  4.   
  5. HRESULT DS_GetAudioVideoInputDevices( std::vector &vectorDevices, REFGUID guidValue )  
  6. {  
  7.     TDeviceName name;   
  8.     HRESULT hr;  
  9.   
  10.     // 初始化  
  11.     vectorDevices.clear();  
  12.   
  13.     // 初始化COM  
  14.     hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );  
  15.     if (FAILED(hr))  
  16.     {  
  17.         return hr;  
  18.     }  
  19.       
  20.     // 创建系统设备枚举器实例  
  21.     ICreateDevEnum *pSysDevEnum = NULL;  
  22.     hr = CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void **)&pSysDevEnum );  
  23.     if (FAILED(hr))  
  24.     {  
  25.         CoUninitialize();  
  26.         return hr;  
  27.     }  
  28.   
  29.     // 获取设备类枚举器  
  30.     IEnumMoniker *pEnumCat = NULL;  
  31.     hr = pSysDevEnum->CreateClassEnumerator( guidValue, &pEnumCat, 0 );  
  32.     if (hr == S_OK)   
  33.     {  
  34.         // 枚举设备名称  
  35.         IMoniker *pMoniker = NULL;  
  36.         ULONG cFetched;  
  37.         while(pEnumCat->Next( 1, &pMoniker, &cFetched ) == S_OK)  
  38.         {  
  39.             IPropertyBag *pPropBag;  
  40.             hr = pMoniker->BindToStorage( NULL, NULL, IID_IPropertyBag, (void **)&pPropBag );  
  41.             if (SUCCEEDED(hr))  
  42.             {  
  43.                 // 获取设备友好名  
  44.                 VARIANT varName;  
  45.                 VariantInit( &varName );  
  46.   
  47.                 hr = pPropBag->Read( L"FriendlyName", &varName, NULL );  
  48.                 if (SUCCEEDED(hr))  
  49.                 {  
  50.                     StringCchCopy( name.FriendlyName, MAX_FRIENDLY_NAME_LENGTH, varName.bstrVal );  
  51.                       
  52.                     // 获取设备Moniker名  
  53.                     LPOLESTR pOleDisplayName = reinterpret_cast(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH * 2));  
  54.                     if (pOleDisplayName != NULL)  
  55.                     {  
  56.                         hr = pMoniker->GetDisplayName( NULL, NULL, &pOleDisplayName );  
  57.                         if (SUCCEEDED(hr))  
  58.                         {  
  59.                             StringCchCopy( name.MonikerName, MAX_MONIKER_NAME_LENGTH, pOleDisplayName );  
  60.                             vectorDevices.push_back( name );  
  61.                         }  
  62.   
  63.                         CoTaskMemFree( pOleDisplayName );  
  64.                     }  
  65.                 }  
  66.   
  67.                 VariantClear( &varName );  
  68.                 pPropBag->Release();                       
  69.             }  
  70.   
  71.             pMoniker->Release();  
  72.         } // End for While  
  73.   
  74.         pEnumCat->Release();  
  75.     }  
  76.   
  77.     pSysDevEnum->Release();  
  78.     CoUninitialize();  
  79.   
  80.     return hr;  
  81. }  
#include "DS_AudioVideoDevices.h" #pragma comment(lib, "Strmiids.lib") HRESULT DS_GetAudioVideoInputDevices( std::vector &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(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; }    

版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(MFC,DirectShow/D3D)