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

来源:互联网 发布:适用于ipad1的软件 编辑:程序博客网 时间:2024/05/09 14:49

开发工具:

Visual Studio v2010

Windows SDK v7.1

版本历史:

V1.0 2010年10月09日

  • 完成正式版本。

功能描述:

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

 

接口函数:

DS_GetAudioVideoInputDevices

 

下载地址:

DS_AudioVideoDevices.zip

源代码:

DS_AudioVideoDevices.h

[cpp] view plaincopy
  1. /* ---------------------------------------------------------- 
  2. 文件名称:DS_AudioVideoDevices.h 
  3.  
  4. 作者:秦建辉 
  5.  
  6. MSN:splashcn@msn.com 
  7.  
  8. 版本历史: 
  9.     V1.0    2010年10月09日 
  10.             完成正式版本。 
  11.  
  12. 功能描述: 
  13.     获取音频视频输入设备列表 
  14.  
  15. 接口函数: 
  16.     DS_GetAudioVideoInputDevices 
  17.  ------------------------------------------------------------ */  
  18. #pragma once  
  19.   
  20. #include <windows.h>  
  21. #include <vector>  
  22. #include <dshow.h>  
  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<TDeviceName> &vectorDevices, REFGUID guidValue );  
  57.   
  58. #ifdef __cplusplus  
  59. }  
  60. #endif  
    

DS_AudioVideoDevices.cpp

[cpp] view plaincopy
  1. #include "DS_AudioVideoDevices.h"  
  2.   
  3. #pragma comment(lib, "Strmiids.lib")  
  4.   
  5. HRESULT DS_GetAudioVideoInputDevices( std::vector<TDeviceName> &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<LPOLESTR>(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. }  




http://blog.csdn.net/jhqin/article/details/5929796
   

0 0