最近手头工作比较轻松了一点就继续研究和完善之前的录屏软件,使用AForge最大的问题在于:最原始的只能够录全屏,而自定义的录屏需要更改非常多的细节:like follows:
1、需要支持区域化录屏;
2、需要支持麦克风录音,并且混音在视频中,同步;
3、需要支持系统声音录取、并且需要混音在视频中,同步;
4、需要支持捕获光标,并且自定义颜色、描边,最重要的是你需要在区域录屏的时候支持坐标位置更新(相对比较难);
前面3个已经在前面的文章介绍了,这里不再赘述。着重列出第4点的内容以及如何解决。如果正在研究录屏这块的朋友们,千万别去copy那什么网上有限制时间录制和收费的录制,特别是有些很恶心的还发表长篇大论写的如何如何实现(的确技术不可否认是实现了),其实最后还是要你付费才能完全使用,就问你恶不恶心!
好了,废话不多说,我们来一一解决;
首先获取系统光标有两种方式,第一种是直接通过系统API进行获取光标,这个是完全记录系统光标在做什么。随着系统光标变化而变化的。这边有用到的是几个类:
第一种方式:【CursorHelper.cs】、【GDIStuff.cs】、【Win32Stuff.cs】相对复杂一些;我就在代码中直接显示就好了,不需要引用任何其他的东西;
CursorHelper.cs
GDIStuff.cs
Win32Stuff.cs
OK,类已经铺垫好了,接下来就在你的视频捕获方法中放入:关键方法--CursorHelper.CaptureCursor(ref x,ref y);
1 Graphics g = Graphics.FromImage(bitmap);//编辑原始视频帧 2 g.SmoothingMode = SmoothingMode.AntiAlias;//设置鼠标质量 3 g.InterpolationMode = InterpolationMode.HighQualityBicubic; 4 g.PixelOffsetMode = PixelOffsetMode.HighQuality; 5 var x = _currentPoint.X; 6 var y = _currentPoint.Y; 7 var cursorBmp = CursorHelper.CaptureCursor(ref x, ref y); 8 if (cursorBmp != null) 9 {10 g.DrawImage(cursorBmp, _currentPoint);11 }12 cursorBmp.Dispose();
**注释说明:其中_currentPoint 是相对于屏幕的坐标Point** 获取方法是--
_currentPoint = System.Windows.Forms.Cursor.Position;//(大屏坐标)
**注释说明:其中bitmap是当前获取的最原始的视频帧(不包含任何的例如光标-声音-什么锤子之类的哈哈哈)**,此类方法就是把原始视频帧重新编辑!
第二种方式:相对简单一点,获取光标_currentPoint还是使用上面的方法,但是不同的地方是我要自定义光标icon,这个又有一点难点就是如何画怎么画;---项目中采用的是外圈描边,内边填充方式;
1 SolidBrush myBrush = new SolidBrush(System.Drawing.Color.FromArgb(50, ColorTranslator.FromHtml("#你的填充颜色")));//设置透明度跟填充颜色 2 System.Drawing.Pen p = new System.Drawing.Pen(ColorTranslator.FromHtml("#你的描边颜色"));//设置透明度跟描边颜色 3 Graphics g = Graphics.FromImage(bitmap);//编辑原始视频帧 4 g.SmoothingMode = SmoothingMode.AntiAlias;//设置鼠标质量 5 g.InterpolationMode = InterpolationMode.HighQualityBicubic; 6 g.PixelOffsetMode = PixelOffsetMode.HighQuality; 7 g.DrawEllipse(p, new Rectangle(_currentPoint.X - this.screenArea.Left, _currentPoint.Y - this.screenArea.Top, 25, 25));//描边 8 g.FillEllipse(myBrush, new Rectangle(_currentPoint.X - this.screenArea.Left, _currentPoint.Y - this.screenArea.Top, 25, 25));//填充圆形区域 9 myBrush.Dispose();10 p.Dispose();11 g.Flush();
**注释:在上述这种方式中特别注意,原始的方法比如你是全屏录制则采用以下方式即可,还有自定义笔刷的画法,我想做完给大家分享。**
1 g.DrawEllipse(p, new Rectangle(_currentPoint.X , _currentPoint.Y, 25, 25));//描边2 g.FillEllipse(myBrush, new Rectangle(_currentPoint.X , _currentPoint.Y, 25, 25));//填充圆形区域
**注释:如果你的录屏方式也存在区域模式,那么就采用 当前光标位置X轴减去你录屏区域的左坐标,当前光标位置Y轴减去你录屏的顶坐标即可获取,这种方式自适应任何区域**
以上是个人在完善时候研究的成果,在此希望把它们分享给更多正在研究的伙伴们,因为研究的时候的确遇到了非常多的问题,我希望这些文章能够给你们一些方向研究,加快你们的开发进度。
工作的事情要做就要做到最好,做到极致,做到无人能及。
http://www.cnblogs.com/BarryJames/p/6950813.html