您的位置:首页 > 其它

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

2010-10-09 15:48 471 查看
开发工具:

Visual Studio v2010

Windows SDK v7.1

版本历史:

V1.0 2010年10月09日

完成正式版本。

功能描述:

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

 

接口函数:

DS_GetAudioVideoInputDevices

 

下载地址:

DS_AudioVideoDevices.zip

源代码:

DS_AudioVideoDevices.h

/* ----------------------------------------------------------
文件名称:DS_AudioVideoDevices.h

作者:秦建辉

MSN:splashcn@msn.com

版本历史:
V1.0	2010年10月09日
完成正式版本。

功能描述:
获取音频视频输入设备列表

接口函数:
DS_GetAudioVideoInputDevices
------------------------------------------------------------ */
#pragma once

#include <windows.h>
#include <vector>
#include <dshow.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:
CLSID_AudioInputDeviceCategory:获取音频输入设备列表
CLSID_VideoInputDeviceCategory:获取视频输入设备列表
返回值:
错误代码
说明:
基于DirectShow
列表中的第一个设备为系统缺省设备
capGetDriverDescription只能获得设备驱动名
*/
HRESULT DS_GetAudioVideoInputDevices( std::vector<TDeviceName> &vectorDevices, REFGUID guidValue );

#ifdef __cplusplus
}
#endif
    

DS_AudioVideoDevices.cpp

#include "DS_AudioVideoDevices.h"

#pragma comment(lib, "Strmiids.lib")

HRESULT DS_GetAudioVideoInputDevices( std::vector<TDeviceName> &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<LPOLESTR>(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;
}
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息