C#使用DirectShow接收摄像头或采集卡图像,可叠加OSD,录制视频,抓拍照片,玩视频监控

作者:V君 发布于:2015-10-28 2:11 Wednesday 分类:挖坑经验

经过几天折腾都是些弯路, 这次不扯也不TL;DR


创建Graph,添加以下Filter

从Video Capture Source分类里面找你的摄像头或者采集卡

Smart Tee (经过这货的preview输出会使画面流畅, 具体我也不知道为啥)

AVI Decompressor (万用的图像格式转换滤镜?

TextOverFilter (参见 Pure .NET DirectShow Filters in C#

(自动添加 Color Space Converter 具体为啥不知道, 反正能工作)

Video Mixing Renderer 9 (不支持远程桌面, 但性能比 VideoRender好, 

远程桌面时用后者, 善用条件编译

用 GraphStudio 画的框图就像这样

点击查看原图

用代码来做以上结构大概就像下面这样, 

可以参考 SVN 上的栗子, 把视频窗口句柄绑好就可以吃了

 

var devices = new DSVideoCaptureCategory().Objects.OrderBy(p => p.Name).ToArray();


_graph = new Graph();


_osd = new TimeLocOsdFilter(_deviceIndex);

_osd.NewFrame += NewFrame;


var cd = _graph.AddDeviceFilter(devices[_deviceIndex]);

var st = _graph.AddFilter(new DSFilter(Misc.SmartTee), "st");

var av = _graph.AddFilter(new DSFilter(Misc.AviDecompressor), "av");

var to = _graph.AddFilter(new DSFilter(_osd), "to");


#if DEBUG

var vr = _graph.AddFilter(new DSFilter(VideoRender.VideoRenderer), "vr"); //FOR RDP

#else

var vr = _graph.AddFilter(new DSFilter(VideoRender.VideoMixingRenderer9), "vr");

#endif


_graph.Connect(cd.OutputPin, st.InputPin);

_graph.Connect(st.Output[1], av.InputPin);

_graph.Connect(av.OutputPin, to.InputPin);

_graph.Connect(to.OutputPin, vr.InputPin);

 

然后是录制视频和抓拍了,由于VFW版本的视频压缩不是很好用 于是这里稍稍走点歪门邪道

OSD的GDI+处理完之后把位图对象丢出来,给外面按需做副本什么的之后再销毁.

抓拍就可以随随便便实现了, 至于写视频文件

依然是像之前用AForge.DirectShow那样把帧交给AForge.FFMPEG


其实老早就用DirectShow玩视频播放了, 这次又遇到视频捕捉的需求, 于是就写成了博文

(其实是再不发这个月就0篇了 



标签: 软件开发 C# 图像处理 Winform 视频监控 DirectShow

评论(0) 引用(0) 浏览(1909)

Powered by emlog 去你妹的备案 sitemap