DirectShow控制台输出和保存视频设备名称

#include "windows.h"
#include "TCHAR.h"
#include <dshow.h>
#include <vector>
#include <iostream>
#include <cwctype>

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

int _tmain(int argc, _TCHAR* argv[])
{
	TDeviceName name;
	HRESULT hr;

	// 初始化
	std::vector<TDeviceName> vectorDevices;
	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(CLSID_VideoInputDeviceCategory, &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);
					std::wcout << name.FriendlyName << std::endl;
					// 获取设备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();
}
时间: 2024-11-08 17:24:45

DirectShow控制台输出和保存视频设备名称的相关文章

Eclipse将控制台输出信息保存为文件

当你在Eclipse中 running/debugging一个应用程序的时候,有关该应用程序的运行调试信息及日志信息都会输出到控制台(console )显示,但是Eclipse只会显示最后一部分的日志信息,如果你的应用程序会产生大量的运行调试信息及日志信息,你可能会想保持这些信息到文件中,以便查看分析. 我们有2种方式去生成一个文件 1.设置Eclipse保存控制台文件.打开Run -> Run Configurations->Common菜单. 设置"Standard Input

视频开发技术 视频设备枚举 C#

由于小编之前使用过BR_Chat的音视频解决方案作视频会议系统开发,所以这里也就以当时的环境和处理机制简单做一个介绍. 1.BR_Chat-枚举本地视频采集设备-方法概述: DWORD BRAC_EnumVideoCapture(TCHAR** lpDeviceName, DWORD& dwDeviceNum); 功能:枚举本地视频采集设备 返回值:0 表示成功,否则为出错代码 参数: lpDeviceName 视频设备名称,可为空,表示只获取设备数量: dwDeviceNum 视频设备数量;

Directshow 判断音视频设备是否被占用&lt;转&gt;

直接上代码吧: 代码是参考网上大神分享的,在原基础上做了些修改(只检测视频设备): int DeviceIsBusy(char *videoName) { //输入设备的音视频名称 HRESULT hr; HRESULT hhr; int ret = 0; int videoBusy = 1; int audioBusy = 1; CoInitialize(NULL); ICreateDevEnum* pSysDevEnum = NULL; hr = CoCreateInstance(CLSID

jenkins控制台输出乱码

根据以往写代码的经验,jenkins控制台输出乱码有可能是编码导致的,问了一下度娘,果然如此,解决办法如下:修改下jenkins的配置文件,设置字符编码为:UTF-8即可,打开jenkins的安装目录,找到jenkins.xml文件,在<arguments>标签处添加红色字体,即定义编码为utf-8<arguments>-Xrs -Xmx512m -Dfile.encoding=utf-8 -Dhudson.lifecycle=hudson.lifecycle.WindowsSer

理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称

本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存储卷挂接和设备名称 这篇文章分析一下一个 Ceph RBD 卷是如何被映射到一个 QEMU/KVM 客户机的,以及客户机中设备的命名问题. 1. 遇到的设备命名问题 1.1 通过 Nova 和 Cinder 做 Ceph RDB 卷挂接和卸载步骤 挂接一个卷: #运行nova-attach 命令no

C#在控制台输出异常所在的行数

对于异常,我们经常用try-catch语句来处理,一种常见的方式是在catch语句块用MessageBox.Show("异常")这种弹窗的方式来报告异常.但是有些时候,有些异常发生时我们不希望弹窗干扰用户,只是想要打印出异常信息查找原因.分析调试而已. 这时候常用的方法有:打印log将异常信息保存到文本中.将异常信息输出到可显示文本的控件中.将异常打印到"输出"窗口中. 其中涉及的关键问题是:如何快速定位异常所在的位置.如果可以输出异常所在的行数其实就可以很好解决这

dir:一行代码,提取出所有视频文件名称及路径

某次,部门接到一个任务,要求对公司现有的视频文件资料做一个统计整理分类的工作. 领导召集开会,问:两周时间够用吗? 统计整理分类工作的第一步骤是把视频文件名称来源类别信息录入到 excel 表格中,才能进行下一步工作. 大家面面相觑,逐一手工复制视频文件名称粘贴至 excel 表格中,耗时费力,数据准确度也不会太高. 我自告奋勇,这一步工作我来搞定. 批处理代码: ------------------------------------------------------- dir /s /b

前端不为人知的一面--前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片

前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来.现分类整理出来分享给大家,也补充了一些平时的积累和扩展了一些内容. HTML篇 浏览器地址栏运行JavaScript代码 这个很多人应该还是知道的,在浏览器地址栏可以直接运行JavaScript代码,做法是以javascript:开

保存视频到相册的相关代码

@implementation ALAssetsLibrary (ZHExpand) /**  *  创建本地相册  *  *  @param name                        相册名称  *  @param enumerateGroupsFailureBlock 遍历相册分组失败回调  *  @param hasGroup                    本地已经存在该相册,请重新命名  *  @param createSuccessedBlock        创