开发环境:Win10 + VS2015

本文介绍一个 "获取音频视频输入设备列表" 的示例代码。

效果图

代码下载

代码下载(VC2015):Github - DShow_simpleVideo

实现代码

DS_GetAudioVideoInputDevices.h

/* ----------------------------------------------------------
文件名称:DS_AudioVideoDevices.h 功能描述:
获取音频视频输入设备列表 接口函数:
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_GetAudioVideoInputDevices.cpp

#include "stdafx.h"
#include "DS_AudioVideoDevices.h" // 用到的DirectShow SDK链接库
#pragma comment(lib, "Strmiids.lib") // 获取音视频输入设备列表
HRESULT DS_GetAudioVideoInputDevices(std::vector<TDeviceName> &vectorDevices, REFGUID guidValue)
{
TDeviceName name;
HRESULT hr; // 初始化vector
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))
{
// 拷贝设备友好名到name.FriendlyName
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))
{
// 拷贝设备Moniker名到name.MonikerName
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;
}

DShow_getVideoDevices.cpp

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <dshow.h>
#include "DS_AudioVideoDevices.h" // 用到的DirectShow SDK链接库
#pragma comment(lib,"strmiids.lib") int _tmain(int argc, _TCHAR* argv[])
{
std::vector<TDeviceName> vectorDevices; // 获取音视频输入设备列表
DS_GetAudioVideoInputDevices(vectorDevices, CLSID_VideoInputDeviceCategory); // 打印"设备友好名"和"设备Moniker名"(摄像头)
for (unsigned int i = 0; i < vectorDevices.size(); i++)
std::wcout << vectorDevices[i].FriendlyName << " | " << vectorDevices[i].MonikerName << std::endl; return 0;
}

参考:

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

DirectShow 视频采集

1.使用DShow获取本机的视音频设备和自带编解码器列表

DirectShow 获取音视频输入设备列表的更多相关文章

  1. iOS - 获取音视频文件的Metadata信息

    // // MusicInfoArray.h // LocationMusic // // Created by Wengrp on 2017/6/22. // Copyright © 2017年 W ...

  2. 获取音视频文件AVMetadata数据

    获取音视频文件AVMetadata数据 问题来源: http://stackoverflow.com/questions/16318821/extracting-mp3-album-artwork-i ...

  3. Flutter中如何方便的获取音视频的长度

    此次主要是flutter集成im,在发送视频时需要加上时长,但是用视频controller只能在初始化时具备路径才可以可以使用:just_audio插件中的方法进行获取 详情看官方文档:https:/ ...

  4. asp.net 获取音视频时长 的方法

    http://www.evernote.com/l/AHPMEDnEd65A7ot_DbEP4C47QsPDYLhYdYg/ 日志:   1.第一种方法:   调用:shell32.dll ,win7 ...

  5. Directshow 采集音视频数据H264+AAC+rtmp效果还不错

    从usb摄像头或者采集卡中采集效果还是不错的.

  6. 音视频技术 即时通讯SDK

    视频流中的DTS/PTS究竟是什么?      DTS(解码时间戳)和PTS(显示时间戳)各自是解码器进行解码和显示帧时相对于SCR(系统參考)的时间戳.SCR能够理解为解码器应该開始从磁盘读取数据时 ...

  7. anyRTC Web SDK 实现音视频呼叫功能

    前言 大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发). 前提条件 在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC ...

  8. HTML5对音视频的处理

      前  言 现在网上有许多的框架和插件,能够满足程序猿的各种需求,慢慢的,就有些忽视最基础的东西. 比如,大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件. H ...

  9. FFmpeg音视频解封装

    一 . 解封装用到的函数和结构体 1.av_register_all() : open 一次就调用一次 2.avformat_network_init() : 网络模块初始化 3.avformat_o ...

随机推荐

  1. PHP $_SERVER超全局变量详解

    参考资料:https://www.php.net/manual/zh/reserved.variables.server.php $_SERVER 是一个包含了诸如头信息(header).路径(pat ...

  2. diango入门(持续更新中)

    学习注意点:理顺项目逻辑,记住重点,项目做好重点注释保留好,以后做项目了能知道这样可以实现,忘了回来查 下载 命令行 pip install django==1.11.26 -i https://py ...

  3. android 启动流程 相关 杂项记录

    Android原生流程 Init进程 主要流程及分支梳理 ueventd_main()watchdogd_main()主要流程a) 公共部分 增加PATH 环境变量初始化内核日志,打开/dev/kms ...

  4. Registering current configuration as safe fallback point

    14:28:23,255 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@f5f2bb7 - URL [jar:file: ...

  5. MySQL 优化 (三)

    参数优化 query_cache_size (1) 简介: 查询缓存简称QC,使用查询缓冲,mysql将查询结果存放在缓冲区中,今后对于同样的select语句(区分大小写),将直接从缓冲区中读取结果. ...

  6. yii2自定义操作按钮

    [ 'class' => 'yii\grid\ActionColumn', 'header' => 'Html::a('操作')',//表单头 'template' => '{vie ...

  7. ETCD:多机上的集群

    原文地址:cluster on multiple machines 总览 启动一个集群静态的要求是每一个集群中的成员需要知道其他成员的位置.在许多情况下,集群成员的IP可能无法提前知道.在这种情况下, ...

  8. 微软、IBM、GitLab 等大厂全部到齐的 OCS 第一天有什么看点?

    在本周一的推文中我们大致介绍了下 Open Core 峰会及到场嘉宾,(≧▽≦) 当然还有 Nebula Graph 在会场的展位位置图,本文我们来看看 Open Core 峰会第一天有哪些值得一看的 ...

  9. three.js实现土星绕太阳体系

    概况如下: 1.SphereGeometry实现自转的太阳,土星: 2.RingGeometry实现土星公转轨道: 3.ImageUtils加载球体贴图: 4.canvas中createRadialG ...

  10. 移动端H5页面遇到的问题总结(转载请注明出处)

    最近刚做完一个移动端的项目,产品之无敌,过程之艰辛,我就不多说了,记录下在这个项目中遇到的问题,以防万一,虽然这些可能都是已经被N多前辈解决掉了的问题,也放在这里,算是为自己漫漫前端路铺了一颗小石子儿 ...