您的位置:首页 > 其它

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

2015-07-15 10:43 429 查看

摘自:秦建辉的专栏

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

开发工具:

Visual Studio v2010

Windows SDK v7.1

版本历史:

V1.0 2010年10月09日

完成正式版本。

功能描述:

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

接口函数:

MF_GetAudioVideoInputDevices

下载地址:

MF_AudioVideoDevices.zip

源代码:

MF_AudioVideoDevices.h

[cpp]
view plaincopyprint?

/* ----------------------------------------------------------
文件名称: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.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

[cpp]
view plaincopyprint?

#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;
}

#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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: