告别OBS!用C#和.NET 6写一个自己的轻量级录屏工具(附完整源码)

张开发
2026/4/17 20:28:41 15 分钟阅读

分享文章

告别OBS!用C#和.NET 6写一个自己的轻量级录屏工具(附完整源码)
用C#打造极简录屏工具从原理到实现的深度实践你是否厌倦了动辄几百MB的录屏软件作为开发者我们完全可以用C#和.NET 6构建一个资源占用不到10MB的轻量级录屏工具。本文将带你从底层原理出发逐步实现一个核心功能完备的录屏应用重点解决三个关键问题如何高效捕获屏幕画面、如何实现低延迟编码以及如何优化内存管理。1. 技术选型为什么选择C#和.NET 6传统录屏工具如OBS功能强大但体积臃肿而我们要构建的是一个专注核心功能的解决方案。C#配合.NET 6提供了几个独特优势原生Windows API集成通过P/Invoke直接调用user32.dll和gdi32.dll实现屏幕捕获跨平台潜力.NET 6的跨平台特性为未来扩展留下空间性能优化相比早期.NET版本.NET 6的GC和JIT有显著提升// 示例使用DllImport引入Windows API [DllImport(user32.dll)] static extern IntPtr GetDesktopWindow(); [DllImport(user32.dll)] static extern IntPtr GetWindowDC(IntPtr hWnd);关键对比方案优点缺点Windows原生API无依赖、性能高需要处理内存管理DirectX帧率稳定实现复杂度高第三方库(如FFmpeg)功能全面增加部署体积2. 屏幕捕获的核心实现屏幕录制本质上是一个连续截图的过程。我们采用Graphics.CopyFromScreen方法作为基础方案// 创建屏幕捕获的Bitmap对象 var bounds Screen.PrimaryScreen.Bounds; var bitmap new Bitmap(bounds.Width, bounds.Height); using (var g Graphics.FromImage(bitmap)) { g.CopyFromScreen( Point.Empty, Point.Empty, bounds.Size, CopyPixelOperation.SourceCopy); }性能优化要点使用Rectangle指定捕获区域而非全屏复用Bitmap对象避免频繁内存分配采用双缓冲技术减少画面撕裂注意高DPI屏幕需要额外处理缩放因子否则捕获的画面可能模糊3. 视频编码与MP4封装原始位图数据体积庞大1920x1080的一帧约6MB必须进行高效压缩。我们采用H.264编码方案// 使用MediaFoundation进行编码初始化 var attributes new MediaFoundationAttributes(); attributes.Set(MediaFoundationAttributes.MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, true); var sinkWriter new MediaFoundationSinkWriter( outputPath, attributes);编码参数配置建议参数推荐值说明帧率30fps平衡流畅度和性能比特率5000kbps1080p视频的合理值GOP大小30影响随机访问和压缩率预设Fast速度与质量的折中4. 内存管理与分段录制长时间录制容易导致内存泄漏我们采用环形缓冲区和自动分段策略预分配固定大小的内存池每10分钟自动保存为新文件文件名自动附加时间戳如recording_20230815_1430.mp4// 分段录制实现逻辑 var timer new System.Timers.Timer(10 * 60 * 1000); // 10分钟 timer.Elapsed (sender, e) { FinalizeCurrentSegment(); StartNewSegment(); }; timer.Start();异常处理要点使用try-catch包装文件操作实现录制状态持久化添加磁盘空间检查逻辑5. 界面设计与热键控制虽然功能是核心但良好的用户体验也至关重要。我们提供两种交互模式命令行模式适合自动化ScreenRecorder --output D:\recordings --duration 60图形界面关键元素实时显示FPS和CPU占用系统托盘图标最小化全局热键支持CtrlAltR开始/停止// 热键注册示例 RegisterHotKey(Handle, 1, KeyModifiers.Control | KeyModifiers.Alt, Keys.R);6. 部署与进阶优化.NET 6的独立部署功能让我们可以生成单个exe文件dotnet publish -c Release -r win-x64 --self-contained true进阶优化方向使用硬件加速编码Intel Quick Sync/NVIDIA NVENC添加鼠标高亮效果实现区域选择录制整个项目保持极简设计最终成品大小控制在8MB左右内存占用不超过100MB1080p录制时。相比动辄几百MB的商用软件这种自研方案特别适合需要长时间后台录制的场景。

更多文章