DirectShow 获取音视频输入设备列表
开发环境: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 获取音视频输入设备列表的更多相关文章
- iOS - 获取音视频文件的Metadata信息
// // MusicInfoArray.h // LocationMusic // // Created by Wengrp on 2017/6/22. // Copyright © 2017年 W ...
- 获取音视频文件AVMetadata数据
获取音视频文件AVMetadata数据 问题来源: http://stackoverflow.com/questions/16318821/extracting-mp3-album-artwork-i ...
- Flutter中如何方便的获取音视频的长度
此次主要是flutter集成im,在发送视频时需要加上时长,但是用视频controller只能在初始化时具备路径才可以可以使用:just_audio插件中的方法进行获取 详情看官方文档:https:/ ...
- asp.net 获取音视频时长 的方法
http://www.evernote.com/l/AHPMEDnEd65A7ot_DbEP4C47QsPDYLhYdYg/ 日志: 1.第一种方法: 调用:shell32.dll ,win7 ...
- Directshow 采集音视频数据H264+AAC+rtmp效果还不错
从usb摄像头或者采集卡中采集效果还是不错的.
- 音视频技术 即时通讯SDK
视频流中的DTS/PTS究竟是什么? DTS(解码时间戳)和PTS(显示时间戳)各自是解码器进行解码和显示帧时相对于SCR(系统參考)的时间戳.SCR能够理解为解码器应该開始从磁盘读取数据时 ...
- anyRTC Web SDK 实现音视频呼叫功能
前言 大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发). 前提条件 在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC ...
- HTML5对音视频的处理
前 言 现在网上有许多的框架和插件,能够满足程序猿的各种需求,慢慢的,就有些忽视最基础的东西. 比如,大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件. H ...
- FFmpeg音视频解封装
一 . 解封装用到的函数和结构体 1.av_register_all() : open 一次就调用一次 2.avformat_network_init() : 网络模块初始化 3.avformat_o ...
随机推荐
- React Hook父组件获取子组件的数据/函数
我们知道在react中,常用props实现子组件数据到父组件的传递,但是父组件调用子组件的功能却不常用.文档上说ref其实不是最佳的选择,但是想着偷懒不学redux,在网上找了很多教程,要不就是hoo ...
- 一文解读RESTful (转)
01 前言 回归正题,看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严 ...
- 分享一个酷炫动态登录页面html
话不多说,如下图: 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <H ...
- 解决idea中mysql连接失败Could not create connection to database server. Attempted reconnect 3 times. Giving up.
原因是少一个参数,设置时区的. 解决方法: 加一个参数: serverTimezone=UTC jdbc:mysql://localhost:3306/SshProject?useUnicode=t ...
- 快速查看本地IP地址
1. 新建Windows批处理文件(*.bat) @echo off echo 本机IP ipconfig|find "IPv4" echo. echo 电脑名 hostname ...
- 使用SQL Server内存优化表 In-Memory OLTP
如果你的系统有高并发的要求,可以尝试使用SQL Server内存优化表来提升你的系统性能.你甚至可以把它当作Redis来使用. 要使用内存优化表,首先要在现在数据库中添加一个支持内存优化的文件组. M ...
- 27.t分布随机近邻嵌入t-SNE
t分布随机近邻嵌入(t-distributed Stohastic Neighbor Embedding) 基本思路:为高维特征空间在二维平面(或三维超平面,不过基本上总是使用二维空间)上寻找一个投影 ...
- (理论知识+HTML+CSS+JavaScript)
今天分享的面试题的答案不确保一定正确,如有错误或有更好的解法,大家可以留言分享你的答案.我在留言区等你更好的答案. 一.理论基础知识部分 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 ...
- windows10 安装win10和ubuntu 16.04双系统
安装教程如下 亲测可用 https://www.cnblogs.com/masbay/p/10844857.html 镜像路径如下 http://releases.ubuntu.com/16.04/ ...
- Python文件操作:文件的打开关闭读取写入
Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...