DirectShow .Net

本文介绍如何使用DirectShowLib库进行视频采集设备的初始化、配置及视频预览。包括获取视频设备列表、设置视频输入设备、初始化DirectShow组件、实现视频预览等功能。

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

实例引用DirectShowLib-2005.dll,这个DLL可以到http://directshownet.sourceforge.net/直接下载使用。1、获取视频采集设备IBaseFilter接口对象的方法//获取所有视频设备名称public ArrayList GetVideoInputDevice() { return GetDeviceCollection(FilterCategory.VideoInputDevice);}private ArrayList GetDeviceCollection(Guid DeviceType) { ArrayList returnString = new ArrayList(); foreach (DsDevice ds in DsDevice.GetDevicesOfCat(DeviceType)) { returnString.Add(ds.Name); } return returnString; }//通过获取到的视频设备名称设置采集设备的IBaseFilter对象 public bool SetVideoInputDevice(string VideoInputDeviceName) { //创建视频输入设备接口 theVideoDevice = CreateFilter(FilterCategory.VideoInputDevice, VideoInputDeviceName); }//通过过滤器类型和过滤器名称获取IBaseFilter接口private IBaseFilter CreateFilter(Guid category, string friendlyname) { object source = null; Guid iid = typeof(IBaseFilter).GUID; foreach (DsDevice device in DsDevice.GetDevicesOfCat(category)) { if (device.Name.CompareTo(friendlyname) == 0) { device.Mon.BindToObject(null, null, ref iid, out source); break; } } return (IBaseFilter)source; }2、初始化基本的接口对象 private void InitInterfaces() { int hr = 0; // 获取IGraphBuilder接口对象 this.m_graphBuilder = (IGraphBuilder)new FilterGraph(); //获取ICaptureGraphBuilder2接口对象 this.m_captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2(); //获取m_graphBuilder 接口对象的IMediaControl对象 this.m_mediaControl = (IMediaControl)this.m_graphBuilder; //获取m_graphBuilder 接口对象的IVideoWindow对象 this.m_videoWindow = (IVideoWindow)this.m_graphBuilder; //获取m_graphBuilder 接口对象的IMediaEventEx对象 this.m_mediaEventEx = (IMediaEventEx)this.m_graphBuilder; //设置ICaptureGraphBuilder2的IGraphBuilder接口对象为当前对象 hr = this.m_captureGraphBuilder.SetFiltergraph(this.m_graphBuilder); DsError.ThrowExceptionForHR(hr); //注册事件到应用程序的窗体上 hr = this.m_mediaEventEx.SetNotifyWindow(this.hwnPropertyPageOwner, WM_GRAPHNOTIFY, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); } 3、开始视频预览public void VideoPreview() try { int hr = 0; hr = this.m_graphBuilder.AddFilter(theVideoDevice, "Video Capture"); DsError.ThrowExceptionForHR(hr); // 通过theVideoDevice(IBaseFilter)视频接口对象的Preview Pin预览 hr = this.m_captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, theVideoDevice, null, null); DsError.ThrowExceptionForHR(hr); //插入SampleGrabber m_pinStill = DsFindPin.ByCategory(theVideoDevice, PinCategory.Still, 0); if (m_pinStill == null) { m_pinStill = DsFindPin.ByCategory(theVideoDevice, PinCategory.Capture, 0); } // 获取theVideoDevice的IAMVideoControl对象,对于具有Still Pin的对象可以获到,采集设备不具备Still Pin,那么该对象将为Null m_VidControl = theVideoDevice as IAMVideoControl; // 设置采集视频参数 if (this.videoHeight + this.videoWidth + this.videoStride > 0) { SetConfigParms(m_pinStill, this.videoWidth, this.videoHeight, 24); } //开始拍照功能所需的接口对象 // 获得SampleGrabber对象接口 sampGrabber = new SampleGrabber() as ISampleGrabber; // 配置sample grabber baseGrabFlt = sampGrabber as IBaseFilter; ConfigureSampleGrabber(sampGrabber); // 将sample grabber添加到图形过滤器中 hr = m_graphBuilder.AddFilter(baseGrabFlt, "Ds.NET Grabber"); DsError.ThrowExceptionForHR(hr); //通过渲染将采集设备的相关输出Pin与sample grabber对象的输入Pin连接起来 //如果采集设备提供Still Pin,则通过Still Pin连接,否则直接使用Capture Pin连接 if (m_VidControl!=null) { hr = this.m_captureGraphBuilder.RenderStream(PinCategory.Still, MediaType.Video, theVideoDevice, null, baseGrabFlt); DsError.ThrowExceptionForHR(hr); } else { hr = this.m_captureGraphBuilder.RenderStream(PinCategory.Capture, MediaType.Video, theVideoDevice, null, baseGrabFlt); DsError.ThrowExceptionForHR(hr); } //设置抓取图片相关参数 SaveSizeInfo(sampGrabber); //拍照功能所需的接口对象添加结束 // 开始将视频窗口绑定到主窗体上 hr = this.m_videoWindow.put_Owner(this.hwnVideoWindowOwner); DsError.ThrowExceptionForHR(hr); hr = this.m_videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren); DsError.ThrowExceptionForHR(hr); if (this.m_videoWindow != null) { this.m_videoWindow.SetWindowPosition(0, 0, this.videoWidth, this.videoHeight); } hr = this.m_videoWindow.put_Visible(OABool.True); DsError.ThrowExceptionForHR(hr); // 开始预览采集设备采集到的视频 hr = this.m_mediaControl.Run(); DsError.ThrowExceptionForHR(hr); m_IsPreview = true; } catch { m_IsPreview = false; throw new Exception("VideoPreview函数出现异常,视频预览失败!"); } }
/---------------------------------------------------------------------\ * 书 名:《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、付费专栏及课程。

余额充值