DirectShowLib directshownet 视频

  1 实例引用DirectShowLib-2005.dll,这个DLL可以到http://directshownet.sourceforge.net/直接下载使用。
  2
  3 1、获取视频采集设备IBaseFilter接口对象的方法
  4
  5 //获取所有视频设备名称
  6 public ArrayList GetVideoInputDevice()
  7       { return GetDeviceCollection(FilterCategory.VideoInputDevice);}
  8 private ArrayList GetDeviceCollection(Guid DeviceType)
  9       {
 10           ArrayList returnString = new ArrayList();
 11           foreach (DsDevice ds in DsDevice.GetDevicesOfCat(DeviceType))
 12           {
 13               returnString.Add(ds.Name);
 14           }
 15           return returnString;
 16       }
 17
 18 //通过获取到的视频设备名称设置采集设备的IBaseFilter对象
 19  public bool SetVideoInputDevice(string VideoInputDeviceName)
 20       {    //创建视频输入设备接口
 21           theVideoDevice = CreateFilter(FilterCategory.VideoInputDevice, VideoInputDeviceName);
 22       }
 23 //通过过滤器类型和过滤器名称获取IBaseFilter接口
 24 private IBaseFilter CreateFilter(Guid category, string friendlyname)
 25       {
 26           object source = null;
 27           Guid iid = typeof(IBaseFilter).GUID;
 28           foreach (DsDevice device in DsDevice.GetDevicesOfCat(category))
 29           {
 30               if (device.Name.CompareTo(friendlyname) == 0)
 31               {
 32                   device.Mon.BindToObject(null, null, ref iid, out source);
 33                   break;
 34               }
 35           }
 36
 37           return (IBaseFilter)source;
 38       }
 39
 40 2、初始化基本的接口对象
 41
 42 private void InitInterfaces()
 43       {
 44           int hr = 0;
 45
 46           // 获取IGraphBuilder接口对象
 47           this.m_graphBuilder = (IGraphBuilder)new FilterGraph();
 48           //获取ICaptureGraphBuilder2接口对象
 49           this.m_captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
 50           //获取m_graphBuilder 接口对象的IMediaControl对象
 51           this.m_mediaControl = (IMediaControl)this.m_graphBuilder;
 52           //获取m_graphBuilder 接口对象的IVideoWindow对象
 53           this.m_videoWindow = (IVideoWindow)this.m_graphBuilder;
 54           //获取m_graphBuilder 接口对象的IMediaEventEx对象
 55           this.m_mediaEventEx = (IMediaEventEx)this.m_graphBuilder;
 56           //设置ICaptureGraphBuilder2的IGraphBuilder接口对象为当前对象
 57           hr = this.m_captureGraphBuilder.SetFiltergraph(this.m_graphBuilder);
 58           DsError.ThrowExceptionForHR(hr);
 59           //注册事件到应用程序的窗体上
 60           hr = this.m_mediaEventEx.SetNotifyWindow(this.hwnPropertyPageOwner, WM_GRAPHNOTIFY, IntPtr.Zero);
 61           DsError.ThrowExceptionForHR(hr);
 62       }
 63
 64
 65
 66
 67
 68
 69
 70 3、开始视频预览
 71 public void VideoPreview()
 72        try
 73       {
 74
 75           int hr = 0;
 76           hr = this.m_graphBuilder.AddFilter(theVideoDevice, "Video Capture");
 77           DsError.ThrowExceptionForHR(hr);
 78
 79           // 通过theVideoDevice(IBaseFilter)视频接口对象的Preview Pin预览
 80           hr = this.m_captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, theVideoDevice, null, null);
 81           DsError.ThrowExceptionForHR(hr);
 82
 83            //插入SampleGrabber
 84           m_pinStill = DsFindPin.ByCategory(theVideoDevice, PinCategory.Still, 0);
 85
 86           if (m_pinStill == null)
 87               {
 88                   m_pinStill = DsFindPin.ByCategory(theVideoDevice, PinCategory.Capture, 0);
 89               }
 90
 91
 92               // 获取theVideoDevice的IAMVideoControl对象,对于具有Still Pin的对象可以获到,采集设备不具备Still Pin,那么该对象将为Null
 93               m_VidControl = theVideoDevice as IAMVideoControl;
 94
 95               // 设置采集视频参数
 96               if (this.videoHeight + this.videoWidth + this.videoStride > 0)
 97               {
 98                   SetConfigParms(m_pinStill, this.videoWidth, this.videoHeight, 24);
 99               }
100
101              //开始拍照功能所需的接口对象
102               // 获得SampleGrabber对象接口
103               sampGrabber = new SampleGrabber() as ISampleGrabber;
104
105               // 配置sample grabber
106               baseGrabFlt = sampGrabber as IBaseFilter;
107               ConfigureSampleGrabber(sampGrabber);
108
109               // 将sample grabber添加到图形过滤器中
110               hr = m_graphBuilder.AddFilter(baseGrabFlt, "Ds.NET Grabber");
111               DsError.ThrowExceptionForHR(hr);
112
113               //通过渲染将采集设备的相关输出Pin与sample grabber对象的输入Pin连接起来
114               //如果采集设备提供Still Pin,则通过Still Pin连接,否则直接使用Capture Pin连接
115               if (m_VidControl!=null)
116               {
117                   hr = this.m_captureGraphBuilder.RenderStream(PinCategory.Still, MediaType.Video, theVideoDevice, null, baseGrabFlt);
118                   DsError.ThrowExceptionForHR(hr);
119
120               }
121               else
122               {
123                   hr = this.m_captureGraphBuilder.RenderStream(PinCategory.Capture, MediaType.Video, theVideoDevice, null, baseGrabFlt);
124                   DsError.ThrowExceptionForHR(hr);
125               }
126             //设置抓取图片相关参数
127               SaveSizeInfo(sampGrabber);
128             //拍照功能所需的接口对象添加结束
129
130
131           // 开始将视频窗口绑定到主窗体上
132           hr = this.m_videoWindow.put_Owner(this.hwnVideoWindowOwner);
133           DsError.ThrowExceptionForHR(hr);
134
135           hr = this.m_videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren);
136           DsError.ThrowExceptionForHR(hr);
137
138           if (this.m_videoWindow != null)
139           {
140               this.m_videoWindow.SetWindowPosition(0, 0, this.videoWidth, this.videoHeight);
141           }
142
143
144           hr = this.m_videoWindow.put_Visible(OABool.True);
145           DsError.ThrowExceptionForHR(hr);
146
147           // 开始预览采集设备采集到的视频
148           hr = this.m_mediaControl.Run();
149
150           DsError.ThrowExceptionForHR(hr);
151           m_IsPreview = true;
152       }
153       catch
154           {
155           m_IsPreview = false;
156           throw new Exception("VideoPreview函数出现异常,视频预览失败!");
157
158       }
159       }
时间: 2024-08-06 08:10:26

DirectShowLib directshownet 视频的相关文章

DirectShowNet 使用摄像头录像+录音

http://www.cnblogs.com/endv/p/6052511.html 1 // ------------------------------------------------------------------ 2 // CaptureTest.cs 3 // Sample application to show the DirectX.Capture class library. 4 // 5 // History: 6 // 2003-Jan-25 BL - created

C#获取视频文件播放长度

下面两种方法只支持部分视频格式,一般格式mp3,wma等等支持 1.使用Shell32 添加引用,选择COM中的Microsoft Shell Controls And Automation引用 /// <summary> /// 长度分钟(支持mp4?) /// </summary> /// <param name="path"></param> /// <returns></returns> public st

WPF中使用DirectShowLib枚举摄像头设备和分辨率

提供window平台下基于Net技术和Qt技术的多点触摸设备应用开发,画板开发,摄像头/展台设备应用开发 本质还是对DX接口的运用,直接代码好理解 1. 定义设备接口 public interface IDevice{ string DeviceName{get;set;} //设备名称 string DevicePath{get;set;} //设备路径 System.Runtime.InteropServices.ComTypes.IMoniker Moniker{get;set;} } 2

爱奇艺、优酷、腾讯视频竞品分析报告2016(一)

1 背景 1.1 行业背景 1.1.1 移动端网民规模过半,使用时长份额超PC端 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>,报告显示,网民的上网设备正在向手机端集中,手机成为拉动网民规模增长的主要因素.截至2015年12月,我国手机网民规模达6.20亿,有90.1%的网民通过手机上网. 图 1  2013Q1~2015Q3在线视频移动端和PC端有效使用时长份额对比 根据艾瑞网民行为监测系统iUserTracker及mUserTrac

C#中使用ffmpeg合并视频

首先将最新的ffmpeg.exe放到debug路径下,下载地址 http://www.ffmpeg.org/download.html 然后调用此方法 public void CombineMp4WithoutTxt(string StrMP4A, string StrMP4B, string StrOutMp4Path) { Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = System.Windows.Forms.Appl

【机器学习实战】Machine Learning in Action 代码 视频 项目案例

MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apache中文网) 视频每周更新:如果你觉得有价值,请帮忙点 Star[后续组织学习活动:sklearn + tensorflow] ApacheCN - 学习机器学习群[629470233] 第一部分 分类 1.) 机器学习基础 2.) k-近邻算法 3.) 决策树 4.) 基于概率论的分类方法:朴素

WordPress解决优酷、土豆视频移动端观看问题并自适应

转:https://www.xhsay.com/wp-iframe-handler-youku-tudou.html 虽然WordPress能直接插入优酷.土豆的视频但是无法在移动端观看,于是乎笨笨就开始各种折腾终于找到了合适的解决办法另外在说一句支持移动端自适应哦. 函数代码 在主题函数文件function.php里面添加以下代码即可,保证在最后一个?>之前就好了 //Youku function wp_iframe_handler_youku($matches, $attr, $url, $

手机上也可以用的快手和火山小视频提取工具

之前分享过一个火山无水印视频提取软件,但是需要安装到电脑上,很多人觉得很麻烦. 今天分享个网页版,无需安装,并且电脑和手机都可以用的视频提取工具,支持提取快手和火山小视频里的任何视频,就连火山小视频里那种<作者不允许他人下载>的视频都可以解析,并且解析出来的视频都是没有水印的.(是不是觉得这工具特别赞,觉得赞的话,给我的文章点个赞吧??) 工具地址: 快手视频解析下载:http://kuaishou.iiilab.com/ 火山小视频解析下载:http://huoshan.iiilab.com

微信小程序------媒体组件(视频,音乐,图片)

今天主要是简单的讲一下小程序当中的媒体组件,媒体组件包括:视频,音乐,图片等. 先来看看效果图: 1:图片Image <!-- scaleToFill:不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素 widthFix:宽度不变,高度自动变化,保持原图宽高比不变 aspectFill:保持纵横比缩放图片,只保证图片的短边能完全显示出来. 也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取. aspectFit: 保持纵横比缩放图片,使图片的长边能完全显示出来.