摘自:秦建辉的专栏
个人独立博客:http://www.firstsolver.com/wordpress/
开发工具:
Visual Studio v2010
Windows SDK v7.1
版本历史:
V1.0 2010年10月09日
- 完成正式版本。
功能描述:
获取音频视频输入设备列表
接口函数:
MF_GetAudioVideoInputDevices
下载地址:
源代码:
MF_AudioVideoDevices.h
- /* ----------------------------------------------------------
- 文件名称:MF_AudioVideoDevices.h
- 作者:秦建辉
- MSN:splashcn@msn.com
- 版本历史:
- V1.0 2010年10月09日
- 完成正式版本。
- 功能描述:
- 获取音频视频输入设备列表
- 接口函数:
- MF_GetAudioVideoInputDevices
- ------------------------------------------------------------ */
- #pragma once
- #include <windows.h>
- #include <vector>
- #include <Mfidl.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:
- MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID:获取音频输入设备列表
- MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID:获取视频输入设备列表
- 返回值:
- 错误代码
- 说明:
- 基于Media Foundation
- 列表中的第一个设备为系统缺省设备
- capGetDriverDescription只能获得设备驱动名
- 操作系统要求Windows 7及以上版本(关键)
- */
- HRESULT MF_GetAudioVideoInputDevices( std::vector<TDeviceName> &vectorDevices, REFGUID guidValue );
- #ifdef __cplusplus
- }
- #endif
MF_AudioVideoDevices.cpp
- #include "MF_AudioVideoDevices.h"
- #include <Mfapi.h>
- #pragma comment(lib, "Mfplat.lib")
- #pragma comment(lib, "Mf.lib")
- HRESULT MF_GetAudioVideoInputDevices( std::vector<TDeviceName> &vectorDevices, REFGUID guidValue )
- {
- TDeviceName name;
- HRESULT hr;
- // 初始化
- vectorDevices.clear();
- // 初始化Media Foundation
- hr = MFStartup( MF_VERSION, MFSTARTUP_LITE );
- if (SUCCEEDED(hr))
- {
- // 创建属性搜索页
- IMFAttributes *pAttributes = NULL;
- hr = MFCreateAttributes( &pAttributes, 1 ); // 要求Windows Vista
- if (SUCCEEDED(hr))
- {
- // 设置搜索关键字-枚举音频视频设备
- hr = pAttributes->SetGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, guidValue );
- if (SUCCEEDED(hr))
- {
- // 获取搜索结果
- IMFActivate **ppDevices = NULL;
- UINT32 dwCount = 0;
- hr = MFEnumDeviceSources( pAttributes, &ppDevices, &dwCount ); // 要求Windows 7
- if (SUCCEEDED(hr))
- {
- if (dwCount == 0)
- { // 没有找到
- hr = E_FAIL;
- }
- for (DWORD i = 0; i < dwCount; i++)
- {
- // 获取设备友好名
- ppDevices[i]->GetString( MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, name.FriendlyName, MAX_FRIENDLY_NAME_LENGTH, NULL );
- // 获取设备Moniker名
- ppDevices[i]->GetString( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, name.MonikerName, MAX_MONIKER_NAME_LENGTH, NULL );
- // 加入列表
- vectorDevices.push_back( name );
- // 释放资源
- ppDevices[i]->Release();
- }
- // 释放内存
- CoTaskMemFree( ppDevices );
- }
- }
- pAttributes->Release();
- }
- // 关闭Media Foundation
- MFShutdown();
- }
- return hr;
- }
版权声明:本文为博主原创文章,未经博主允许不得转载。