DirectShow捕获视频并预览

本文介绍了一个使用DirectShow的C++示例程序,该程序实现从摄像头捕获视频并显示。通过创建过滤器图、捕获过滤器及设备枚举器,实现了设备的枚举、选择和捕获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <dshow.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"strmiids.lib")

void main() {
	IGraphBuilder *pGraph;//过滤器图表接口
	IMediaControl *pControl;//控制器接口
	IMediaEvent *pEvent;//事件接口
	ICaptureGraphBuilder2* pBuild;//构建捕获图和其他自定义过滤器图
	ICreateDevEnum *pEnum;//设备枚举器
	IEnumMoniker *ppEnumMoniker = NULL;
	IMoniker *pMoniker = NULL;

	HRESULT hr = CoInitialize(NULL);//初始化com库

	if (FAILED(hr)) {
		return;
	}
	
	hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,
		IID_IGraphBuilder,(void **)&pGraph);//创建过滤器图表管理器

	hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERVER,
		IID_ICaptureGraphBuilder2, (void **)&pBuild);//创建捕获过滤器

	hr= CoCreateInstance(CLSID_SystemDeviceEnum,NULL,
		CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pEnum));//创建设备枚举过滤器
	//创建指定的设备类的枚举器。
	pEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &ppEnumMoniker, 0);

	IPropertyBag *pPropBag;//存储设备属性
	ppEnumMoniker->Next(1, &pMoniker, NULL);//检索枚举序列中指定数量的项目
	pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag)); //绑定到指定对象的存储
	
	VARIANT var;//存储设备信息变量
	VariantInit(&var);
	pPropBag->Read(L"FriendlyName", &var, 0);//读取设备名称
	cout << var.bstrVal << endl;

	IBaseFilter *pCap = NULL;//过滤器图控制器
	hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);//绑定到指定的对象
	if (SUCCEEDED(hr))
	{
		hr = pGraph->AddFilter(pCap, L"Capture Filter");//向图表添加捕获过滤器
	}

	pBuild->SetFiltergraph(pGraph);//指定要使用的捕获图构建器的过滤器图
	hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);//查询控制器接口
	hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);//查询时间接口

	pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
		pCap, NULL, NULL);//将源滤波器上的输出引脚连接到宿滤波器
	
	pControl->Run();//运行
	
	pControl->Release();
	pEvent->Release();
	pGraph->Release();
	//释放过滤器

	CoUninitialize();//卸载COM组件
	system("pause");
}

步骤

1.创建过滤器图,捕获过滤器,枚举设备过滤器

2.连接过滤器引脚

3.运行

/---------------------------------------------------------------------\ * 书 名:《DirectShow开发指南》 * 作 者: 陆其明(著) 金邦飞(审校) * 内容提要: 本书以DirectX SDK 9.0版为蓝本,涉及的内容几乎涵盖了在Windows平台上使 用DirectShow进行C++编码的方方面面。全书共分4个部分。第1部分详细介绍了 DirectShow的基础知识。第2部分重点讨论了Filter的开发,以及DirectShow 应用程序的开发,包括目前非常流行的如音视频采集、数码摄像机的支持、非线性 编辑等应用。第3部深入分析了DirectShow SDK提供的部分典型源代码例子。第 4部分结合作者个人的一些开发实践,通过案例和开放源码分析,进一步介绍 DirectShow的实务应用。 本书完全忠实于DirectX SDK 9.0的帮助文档以及基类源代码,结合作者多年 的实践,经过提炼而成。内容丰富,条理清晰,实用性强。适合广大的流媒体应用 开发人员,以及对Windows平台上多媒体处理感兴趣的编程爱好者、学生学习和参 考。 * 下载内容说明: readme.txt:本说明文件。 Chapter04:第4章用到的代码,其中AppIPTransform为MFC Filter的例子, DsDemo是一些演示代码,FilterTitleOverlay是字符叠加Filter的源代码。 Chapter05:第5章用到的代码,其中GraphBuilding为Filter Graph构建技术 的一些代码,SimplePlayer为一个简单的播放器例子。 Chapter07:第7章用到的代码,其中DsDemo是一些演示代码。 Chapter09:第9章用到的代码,其中DESCallback演示了控制DirectShow智能 连接的方法。 Chapter18:第18章用到的代码,其中MpegNetwork为“MPEG流的网络客户端播放” 实现的所有源代码(请打开Daisy.dsw浏览各项目)。 Chapter19:第19章用到的代码,其中DVD2AVI_1.77.3_SRC.zip为开放源码, FilterMpeg2VD为此开放源码基础上开发的MPEG-2 Video Decoder Filter例子。 除上述代码外,本书各章用到的其他代码均在DirectX SDK安装目录的Samples 子目录下可以找到。 * 备注: DirectX SDK 9.0以及DirectX 9.0运行时库可以到微软的网站上下载。 请访问微软的网站首页http://www.microsoft.com,然后输入DirectX进行搜 索;或者直接访问http://www.microsoft.com/directx下载运行时库,或者 http://www.microsoft.com/downloads/details.aspx?FamilyId=9216652F-51E0-402E-B7B5-FEB68D00F298&displaylang=en * 技术支持网站:http://hqtech.nease.net \---------------------------------------------------------------------/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值