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

来源:互联网 发布:淘宝怎么申请小号 编辑:程序博客网 时间:2024/05/19 17:50

开发工具:

Visual Studio v2010

Windows SDK v7.1

版本历史:

V1.0 2010年10月09日

  • 完成正式版本。

功能描述:

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

 

接口函数:

MF_GetAudioVideoInputDevices 

下载地址:

MF_AudioVideoDevices.zip

源代码:

MF_AudioVideoDevices.h

[cpp] view plaincopy
  1. /* ---------------------------------------------------------- 
  2. 文件名称:MF_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.     MF_GetAudioVideoInputDevices 
  17.  ------------------------------------------------------------ */  
  18. #pragma once  
  19.   
  20. #include <windows.h>  
  21. #include <vector>  
  22. #include <Mfidl.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.         MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID:获取音频输入设备列表 
  48.         MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID:获取视频输入设备列表 
  49. 返回值: 
  50.     错误代码 
  51. 说明: 
  52.     基于Media Foundation 
  53.     列表中的第一个设备为系统缺省设备 
  54.     capGetDriverDescription只能获得设备驱动名 
  55.     操作系统要求Windows 7及以上版本(关键) 
  56. */  
  57. HRESULT MF_GetAudioVideoInputDevices( std::vector<TDeviceName> &vectorDevices, REFGUID guidValue );  
  58.   
  59. #ifdef __cplusplus  
  60. }  
  61. #endif  
   

MF_AudioVideoDevices.cpp

[cpp] view plaincopy
  1. #include "MF_AudioVideoDevices.h"  
  2. #include <Mfapi.h>  
  3.   
  4. #pragma comment(lib, "Mfplat.lib")  
  5. #pragma comment(lib, "Mf.lib")  
  6.   
  7. HRESULT MF_GetAudioVideoInputDevices( std::vector<TDeviceName> &vectorDevices, REFGUID guidValue )  
  8. {  
  9.     TDeviceName name;  
  10.     HRESULT hr;  
  11.   
  12.     // 初始化  
  13.     vectorDevices.clear();     
  14.   
  15.     // 初始化Media Foundation  
  16.     hr = MFStartup( MF_VERSION, MFSTARTUP_LITE );  
  17.     if (SUCCEEDED(hr))  
  18.     {  
  19.         // 创建属性搜索页  
  20.         IMFAttributes *pAttributes = NULL;  
  21.         hr = MFCreateAttributes( &pAttributes, 1 ); // 要求Windows Vista  
  22.         if (SUCCEEDED(hr))  
  23.         {  
  24.             // 设置搜索关键字-枚举音频视频设备  
  25.             hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, guidValue );  
  26.             if (SUCCEEDED(hr))  
  27.             {  
  28.                 // 获取搜索结果  
  29.                 IMFActivate **ppDevices = NULL;  
  30.                 UINT32 dwCount = 0;  
  31.   
  32.                 hr = MFEnumDeviceSources( pAttributes, &ppDevices, &dwCount );  // 要求Windows 7  
  33.                 if (SUCCEEDED(hr))  
  34.                 {  
  35.                     if (dwCount == 0)  
  36.                     {   // 没有找到  
  37.                         hr = E_FAIL;  
  38.                     }  
  39.   
  40.                     for (DWORD i = 0; i < dwCount; i++)  
  41.                     {  
  42.                         // 获取设备友好名  
  43.                         ppDevices[i]->GetString( MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, name.FriendlyName, MAX_FRIENDLY_NAME_LENGTH, NULL );  
  44.   
  45.                         // 获取设备Moniker名  
  46.                         ppDevices[i]->GetString( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, name.MonikerName, MAX_MONIKER_NAME_LENGTH, NULL );  
  47.   
  48.                         // 加入列表  
  49.                         vectorDevices.push_back( name );  
  50.   
  51.                         // 释放资源  
  52.                         ppDevices[i]->Release();  
  53.                     }  
  54.   
  55.                     // 释放内存  
  56.                     CoTaskMemFree( ppDevices );  
  57.                 }         
  58.             }  
  59.   
  60.             pAttributes->Release();  
  61.         }  
  62.   
  63.         // 关闭Media Foundation  
  64.         MFShutdown();  
  65.     }  
  66.   
  67.     return hr;  
  68. }  

   


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

1 0
原创粉丝点击