栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

用 .NET / C# 实现录屏小程序并保存为视频文件

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用 .NET / C# 实现录屏小程序并保存为视频文件

用 .NET / C# 开发一个录屏小程序 实现思路:

不断的获取桌面屏幕的图像,每一张图像我们称为 一帧 。
这里介绍一下 帧率 (FPS , Frame per Second) 的概念:每秒显示的帧数。

人类视觉系统每秒可处理10到12张图像并单独感知它们,也就是说,假如,每秒有超过12张连续的图像经过人的眼睛,人眼就会认为这是连贯的。
例如:12 帧率的 2D 动画,24 帧率的电影,25 帧率的高清电视,30 帧率的 3D 动漫,60 帧率的游戏 等…

最后把获取桌面屏幕的一张张图像再合成视频,就可以完成一个简单的录屏小程序了。

话不多说,直接上干货:

这里我的开发环境是在 Windows 系统下 VS2019 和 .NET Framework 4.6.1

获取桌面屏幕图像
/// 
/// 声明一个 Rectangle 对象,用来指定矩形的位置和大小
/// 
private readonly Rectangle _bounds = Screen.PrimaryScreen.Bounds;

/// 
/// 获取鼠标位置的 Rectangle 对象值
/// 
/// 
private static Rectangle GetMousePositionRectangle()
{
    return new Rectangle(MousePosition.X + -5, MousePosition.Y + -5, 32, 32);
}

/// 
/// 获取 桌面屏幕图片
/// 
/// 
private Bitmap GetScreenImgByteArray()
{
    Bitmap bitmap = new Bitmap(_bounds.Width, _bounds.Height, PixelFormat.Format24bppRgb);

    using (Graphics graphics = Graphics.FromImage(bitmap))
    {
        graphics.CopyFromScreen(Point.Empty, Point.Empty, _bounds.Size, CopyPixelOperation.SourceCopy);

        switch (MouseButtons)
        {
            default:
            	// 插入鼠标指针的图标
                graphics.DrawIcon(Resources.MousePointerImg, GetMousePositionRectangle());
                break;

            case MouseButtons.Left:
            	// 插入鼠标左键的图标
                graphics.DrawIcon(Resources.MouseLeftImg, GetMousePositionRectangle());
                break;

            case MouseButtons.Right:
            	// 插入鼠标右键的图标
                graphics.DrawIcon(Resources.MouseRightImg, GetMousePositionRectangle());
                break;

            case MouseButtons.Middle:
            	// 插入鼠标滚轮键的图标
                graphics.DrawIcon(Resources.MouseWheelImg, GetMousePositionRectangle());
                break;
        }

        return bitmap;
    }
}

桌面屏幕的图像我们已经可以获取到了,接下来就是把一张张的图像合成一个视频文件。
这里我用到了适合 C# 的 OpenCV 开源库:OpenCvSharp4。

注意:因为我是在 Windows 系统下开发的,所以也需要安装 OpenCvSharp4.runtime.win;
还有一个问题,如果写入视频报错,需要卸载这个 NuGet 包,重新安装。

如下图,使用 NuGet 即可安装使用。

图像写入视频
/// 
/// 声明一个 VideoWriter 对象,用来写入视频文件
/// 
private VideoWriter _videoWriter = null;

/// 
/// 用来存放 桌面屏幕图片的线程安全队列
/// 
private readonly ConcurrentQueue _screenImgByteArray = new ConcurrentQueue();

/// 
/// 视频写入中锁对象
/// 
private readonly object _videoWriteingLock = new object();

/// 
/// 生成视频所需的 fps 参数值,来自界面上的选择;默认 15
/// 
private double _fps = 15;


// 初始化
{
    // path 写入的视频文件绝对路径 "......xxx.mp4"
    _videoWriter = new VideoWriter(path, new FourCC(FourCC.XVID), _fps, new OcvSize(_bounds.Width, _bounds.Height));
}

// 循环体
{
    Bitmap img = null;
    try
    {
        if (_screenImgByteArray.TryDequeue(out img))
        {
            using (Mat mat = BitmapConverter.ToMat(img))
            {
                using (InputArray input = InputArray.Create(mat))
                {
                    lock (_videoWriteingLock)
                    {
                        // 写入视频
                        _videoWriter?.Write(input);
                    }
                }
            }
        }
    }
    catch (Exception)
    {
        continue;
    }
    finally
    {
        img?.Dispose();
        img = null;
    }
}

// 结束时
{
    lock (_videoWriteingLock)
    {
        _videoWriter?.Dispose(); // 结束后一定要调用 Dispose()
        _videoWriter = null;
    }
}

上面代码只是部分核心代码,仅供参考。
具体的代码示例我已经放在 GitHub 上,如下链接:
程序源码

运行效果:

因为具体的示例代码还是稍微复杂一些,这里只是粘出来部分的核心代码,详细的示例请到 GitHub 下载源码后详细研究!示例仅供参考!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/907761.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号