c#屏幕录制

使用的开源的视频处理组件AForge,当然它所包含的功能远不止于此,想了解更多到官网上去看吧。一下代码主要是录制桌面屏幕,每20秒存入一个视频文件,可以为有类似需要的同学提供一点帮助。

注:在指定时间启动录制那个功能下面代码没有做,有需要的可以自己改一下代码。

 

 /// <summary>
    /// 比特率
    /// </summary>
    public enum BitRate : int
    {
        _50kbit = 5000,
        _100kbit = 10000,
        _500kbit = 50000,
        _1000kbit = 1000000,
        _2000kbit = 2000000,
        _3000kbit = 3000000
    }

 

/// <summary>
    /// 屏幕录制模板
    /// </summary>
    public class ScreenRecorderTemplate
    {
        /// <summary>
        /// 模板名称
        /// </summary>
        public string TmpName { get; set; }
        /// <summary>
        /// 录屏开始时间
        /// </summary>
        public DateTime? StartDateTime { get; set; }
        /// <summary>
        /// 录屏结束时间
        /// </summary>
        public DateTime? StopDateTime { get; set; }
        /// <summary>
        /// 是否为开机启动
        /// </summary>
        public bool IsStartUp { get; set; }

    }

 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.FFMPEG;

namespace ConsoleRecoderTest
{
    /// <summary>
    /// 屏幕录制工具类
    /// </summary>
    public class ScreenRecorderTool
    {
        #region Fields
        private int screenWidth;
        private int screenHight;
        private int bitRate = (int)BitRate._500kbit;
        private int frameRate = 5;//默认帧率为5
        private bool isRecording;


        private string saveFolderPath;
        private string fileName;
        private Stopwatch stopWatch;
        private Rectangle screenArea;
        private VideoFileWriter videoWriter;
        private ScreenCaptureStream videoStreamer;
        private VideoCodec videoCodec = VideoCodec.MSMPEG4v2;
        private ScreenRecorderTemplate recorderTmp;
        private static object key = new object();
        #endregion
        /// <summary>
        /// 是否正在录制
        /// </summary>
        private bool IsRecording
        {
            get
            {
                lock (key)
                {
                    return isRecording;
                }
            }
            set
            {
                lock (key)
                {
                    isRecording = value;
                }
            }
        }
        public ScreenRecorderTool(ScreenRecorderTemplate recorderTmp)
        {
            this.recorderTmp = recorderTmp;
            this.screenWidth = SystemInformation.VirtualScreen.Width;
            this.screenHight = SystemInformation.VirtualScreen.Height;
            this.IsRecording = false;
            this.SaveFolderPath = AppDomain.CurrentDomain.BaseDirectory;
            this.stopWatch = new Stopwatch();
            this.screenArea = Rectangle.Empty;
            SetScreenArea();
        }
        /// <summary>
        /// 视频保存位置
        /// </summary>
        private string SaveFolderPath
        {
            get { return this.saveFolderPath; }
            set
            {
                if (string.IsNullOrEmpty(value))
                {
                    throw new ArgumentNullException("saveFolderpath", "保存路径不能为空");
                }
                this.saveFolderPath = value;
            }
        }
        /// <summary>
        /// 视频文件名称
        /// </summary>
        private string FileName
        {
            get { return this.fileName; }
            set
            {
                if (string.IsNullOrEmpty(value))
                {
                    throw new ArgumentNullException("fileName", "File name can not be empty or null");
                }
                this.fileName = value;
            }
        }
        /// <summary>
        /// 完成一帧录制的事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void video_NewFrame(object sender, NewFrameEventArgs e)
        {
            if (this.IsRecording)
            {
                if (videoWriter != null)
                {
                    this.videoWriter.WriteVideoFrame(e.Frame);
                }
                if (this.stopWatch.Elapsed.Seconds >= 20)
                {
                    Console.WriteLine("超过指定时间,写入文件");
                    StopRecording();
                }
            }
            else
            {
                videoStreamer.SignalToStop();
                videoWriter.Close();
                videoWriter.Dispose();
                //GC.Collect();
                Console.WriteLine("停止录制");
                if (recorderTmp.IsStartUp)//开机录制
                {
                    StartRecording();
                }
                else
                {
                    if (DateTime.Now <= recorderTmp.StopDateTime.Value)
                    {
                        Console.WriteLine("记录重启录制");
                        StartRecording();
                    }
                    else
                    {
                        Console.WriteLine("时间到不再录制");
                    }
                }
            }
        }

        /// <summary>
        /// 设置必要参数打开视频写入工具
        /// </summary>
        private void InitializeRecordingParameters()
        {
            if (!this.IsRecording)
            {
                this.IsRecording = true;
                CreateCatalog();
                this.FileName = saveFolderPath + string.Format
                    (@"{0}-{1}.avi",
                    "MSR",
                    DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss"));
                this.videoWriter.Open(this.FileName, this.screenWidth, this.screenHight, this.frameRate, this.videoCodec, this.bitRate);
            }
        }

        /// <summary>
        /// 创建目录
        /// </summary>
        private void CreateCatalog()
        {
            if (saveFolderPath == AppDomain.CurrentDomain.BaseDirectory)
            {
                var catalog = SaveFolderPath + DateTime.Now.ToString("yyyy-MM-dd") + "\\";
                if (!System.IO.Directory.Exists(catalog))
                {
                    System.IO.Directory.CreateDirectory(catalog);
                }
                SaveFolderPath = catalog;
            }
        }

        /// <summary>
        /// 设置屏幕录制区域为全屏
        /// </summary>
        private void SetScreenArea()
        {
            foreach (Screen screen in Screen.AllScreens)
            {
                this.screenArea = Rectangle.Union(this.screenArea, screen.Bounds);
            }

            if (this.screenArea == Rectangle.Empty)
            {
                //logger.Error("没有获取到屏幕信息");
                throw new InvalidOperationException("Screan area can not be set");
            }
        }
        /// <summary>
        /// 旧文件清理(避免文件大小超标)
        /// </summary>
        private void ClearOldVideo()
        {

        }

        #region public method

        /// <summary>
        /// 打开视频流开始录制
        /// </summary>
        public void StartRecording()
        {
            if (recorderTmp == null)
            {
                Console.WriteLine("模板不能为空");
                return;
            }
            if (!recorderTmp.IsStartUp)
            {
                if (!recorderTmp.StartDateTime.HasValue
                    || !recorderTmp.StopDateTime.HasValue
                    || recorderTmp.StartDateTime.Value > recorderTmp.StopDateTime.Value)
                {
                    Console.WriteLine("模板不正确");
                    return;
                }
            }
            this.videoWriter = new VideoFileWriter();
            InitializeRecordingParameters();
            this.videoStreamer = new ScreenCaptureStream(this.screenArea);
            this.videoStreamer.NewFrame += new NewFrameEventHandler(video_NewFrame);
            this.videoStreamer.Start();
            this.stopWatch.Start();
            this.IsRecording = true;
            Console.WriteLine("开始录制...");
        }
        /// <summary>
        /// 停止录制
        /// </summary>
        public void StopRecording()
        {
            this.stopWatch.Reset();
            this.IsRecording = false;
        }

        #endregion
    }
}

 

示例调用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleRecoderTest
{
    class Program
    {
        static void Main(string[] args)
        {
            ScreenRecorderTemplate tmp = new ScreenRecorderTemplate()
            {
                IsStartUp = false,
                StartDateTime = DateTime.Now,
                StopDateTime = DateTime.Now.AddMinutes(2)
            };
            new ScreenRecorderTool(tmp).StartRecording();
            Console.WriteLine("complete");
            Console.Read();
        }
    }
}

 

转载于:https://www.cnblogs.com/yyq745201/p/5334294.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值