using System; using System.Runtime.InteropServices; using Accord.Video; using Accord.Video.FFMPEG; namespace XHWK.WKTool.Utils { public class ZVideoRecordHelper { public enum RecordState { stop = 0, start = 1, pause = 2 } RecordState _state = RecordState.stop; string _filePath = ""; int _width = 0; int _height = 0; //录制帧率 int _rate = 5; //录制质量 int _quality = 8; bool _captureMouse = false; private VideoFileWriter videoWriter = new VideoFileWriter();//视频写入 private ScreenCaptureStream videoStreamer;//视频捕获 public ZVideoRecordHelper(string filePath, int width,int height,int rate = 5,int quality=8, bool captureMouse = false) { _filePath = filePath; _width = width / 2 * 2; _height = height / 2 * 2; _rate = rate; _quality = quality; _captureMouse = captureMouse; } /// /// 开始录制 /// public bool StartRecordVideo() { _state = RecordState.start; try { // 打开写入 lock (this) { videoWriter.Open( _filePath, _width, _height, _rate, VideoCodec.MPEG4, _width * _height * _quality ); } System.Drawing.Rectangle rec = new System.Drawing.Rectangle(0,0,_width,_height); videoStreamer = new ScreenCaptureStream(rec, 1000 / _rate);//帧间隔需要和帧率关联,不然录的10秒视频文件不是10s videoStreamer.NewFrame += VideoNewFrame; videoStreamer.Start(); } catch (Exception ex) { return false; } return true; } [DllImport("user32.dll")] private static extern bool GetCursorInfo(out CURSORINFO pci); [StructLayout(LayoutKind.Sequential)] private struct POINT { public Int32 x; public Int32 y; } [StructLayout(LayoutKind.Sequential)] private struct CURSORINFO { public Int32 cbSize; public Int32 flags; public IntPtr hCursor; public POINT ptScreenPos; } // 帧返回时绘制上鼠标 private void VideoNewFrame(object sender, NewFrameEventArgs e) { if (_state == RecordState.start) { if (_captureMouse) { var g = System.Drawing.Graphics.FromImage(e.Frame); CURSORINFO pci; pci.cbSize = Marshal.SizeOf(typeof(CURSORINFO)); GetCursorInfo(out pci); try { System.Windows.Forms.Cursor cur = new System.Windows.Forms.Cursor(pci.hCursor); cur.Draw( g, new System.Drawing.Rectangle( System.Windows.Forms.Cursor.Position.X - 10, System.Windows.Forms.Cursor.Position.Y - 10, cur.Size.Width, cur.Size.Height ) ); } catch { }//打开任务管理器时会导致异常 } videoWriter.WriteVideoFrame(e.Frame); } } /// /// 结束录制 /// public void StopRecordVideo() { _state = RecordState.stop; // 停止 videoStreamer.Stop(); //结束写入 videoWriter.Close(); videoWriter.Dispose(); } /// /// 暂停录制 /// public void PauseRecordVideo() { _state = RecordState.pause; } /// /// 恢复录制 /// public void ResumeRecordVideo() { _state = RecordState.start; } } }