using System; using System.Drawing.Imaging; using System.Drawing; using System.Runtime.InteropServices; using Accord.Video; using Accord.Video.FFMPEG; namespace XHWK.WKTool.Utils { using System.Linq; public class ZVideoRecordHelper { public enum RecordState { Stop = 0, Start = 1, Pause = 2 } private RecordState _state = RecordState.Stop; private string _filePath; private int _width; private int _height; //录制帧率 private int _rate = 5; //录制质量 private int _quality = 8; private 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; _state = RecordState.Pause; 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) { } } /// /// 开始录制 /// public bool StartRecordVideo() { _state = RecordState.Start; 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; } /// /// 生成缩略图 /// /// /// public static void GetVideoPic(string mp4Path, string picPath) { using (var video = new VideoFileReader()) { video.Open(mp4Path); int frameNum = video.FrameCount > 3 ? 3 : 0; using (var bmp = video.ReadVideoFrame(frameNum)) { SaveAsJpeg ( bmp, picPath, 90 ); } video.Close(); } } // 保存为jpeg格式,quality为图像质量(0-100) public static void SaveAsJpeg ( Bitmap bitmap, string fileName, int quality ) { var jpegEncoder = ImageCodecInfo.GetImageEncoders().First(codec => codec.FormatID == ImageFormat.Jpeg.Guid); var encoderParameters = new EncoderParameters(1); encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); bitmap.Save ( fileName, jpegEncoder, encoderParameters ); } } }