2025-11-03
C#
00

在数字化时代,屏幕录制工具已成为教育培训、软件演示和内容创作的必备工具。本文将详细讲解如何使用C#开发一款功能完善的屏幕录制工具,从界面设计到核心功能实现,一步步带您构建自己的屏幕捕获应用。

项目概述

我们将开发一个Windows窗体应用程序,具备以下核心功能:

  • 支持全屏、当前窗口录制
  • 可调节帧率控制视频质量和文件大小
  • 支持鼠标光标捕获
  • 使用MJPEG编码器实现高效视频压缩
  • 录制完成后可直接预览视频文件

开发环境准备

开发此应用需要以下环境和工具:

  • Visual Studio(2019或更高版本)
  • .NET Framework 4.5+
  • SharpAvi库(用于AVI视频文件创建)

首先,创建一个Windows窗体应用程序,并通过NuGet包管理器安装SharpAvi库:

PowerShell
Install-Package SharpAvi

用户界面设计

一个直观的用户界面对于屏幕录制工具至关重要。我们的界面包含以下关键元素:

  1. 开始/停止录制按钮
  2. 录制区域选择下拉框(全屏/当前窗口/自定义区域)
  3. 帧率设置数值控件
  4. 鼠标捕获选项复选框
  5. 状态显示标签
2025-11-01
C#
00

在当今数字化时代,语音识别技术已经成为人机交互的重要组成部分。OpenAI推出的Whisper模型以其卓越的多语言语音识别能力,正在revolutionizing语音转文字领域。本文将详细介绍如何在C#项目中集成Whisper,实现高精度的语音转文字功能。

什么是Whisper?

Whisper是OpenAI开发的一个开源语音识别模型,具有以下特点:

  • 支持多达99种语言的语音识别
  • 提供强大的翻译功能
  • 对背景噪音有很强的抵抗力
  • 识别准确率高
  • 支持长时间音频处理

在本地使用Whisper.net库

对于需要离线处理或者对隐私有更高要求的场景,可以使用Whisper.net库在本地运行Whisper模型。

准备工作

安装Whisper.net NuGet包:

Bash
dotnet add package Whisper.net dotnet add package Whisper.net.Runtime dotnet add NAudio

image.png

模型手动下载

Markdown
https://huggingface.co/sandrohanea/whisper.net/tree/main/classic

完整代码示例

C#
using Whisper.net.Ggml; using Whisper.net; using NAudio.Wave; namespace AppWhisper { internal class Program { static async Task Main(string[] args) { // 模型路径 string modelPath = "D:\\Models\\ggml-medium.bin"; // 检查模型文件是否存在,不存在则下载 if (!File.Exists(modelPath)) { Console.WriteLine("下载Whisper模型中..."); // 下载medium模型,适合大多数场景 using var modelStream = await WhisperGgmlDownloader.GetGgmlModelAsync(GgmlType.Medium); using var fileWriter = File.OpenWrite(modelPath); await modelStream.CopyToAsync(fileWriter); } try { // 指定要转录的音频文件 string audioFilePath = "Recording.mp3"; if (Path.GetExtension(audioFilePath).ToLower() == ".mp3") { // 如果是MP3文件,则先转换为WAV格式 audioFilePath = ConvertMp3ToWav(audioFilePath); } Console.WriteLine("加载Whisper模型..."); // 初始化Whisper处理器 using var whisperFactory = WhisperFactory.FromPath(modelPath); // 创建Whisper处理器实例,可以配置处理参数 using var processor = whisperFactory.CreateBuilder() .WithLanguage("zh") // 设置语言为中文 //.WithTranslate .WithSingleSegment() .WithPrintSpecialTokens() .WithPrintProgress() .WithPrintResults() .Build(); Console.WriteLine("开始处理音频文件..."); // 打开音频文件 using var audioFileStream = File.OpenRead(audioFilePath); // 执行处理并获取分段结果 var results = processor.ProcessAsync(audioFileStream); // 创建用于保存结果的文件 using var writer = new StreamWriter("transcription_local.txt"); // 处理并保存每个分段的结果 await foreach (var segment in results) { string text = segment.Text; Console.WriteLine($"[{segment.Start}->{segment.End}]: {text}"); await writer.WriteLineAsync($"[{segment.Start:hh\\:mm\\:ss\\.fff} -> {segment.End:hh\\:mm\\:ss\\.fff}]: {text}"); } Console.WriteLine("处理完成!结果已保存到 transcription_local.txt"); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine($"发生错误:{ex.Message}"); } } // 将MP3转换为WAV格式 public static string ConvertMp3ToWav(string mp3FilePath) { string wavFilePath = Path.ChangeExtension(mp3FilePath, ".wav"); using (var reader = new Mp3FileReader(mp3FilePath)) { WaveFormat format = new WaveFormat(16000, 16, 1); // 16kHz, 16bit, 单声道 using (var converter = new MediaFoundationResampler(reader, format)) { WaveFileWriter.CreateWaveFile(wavFilePath, converter); } } return wavFilePath; } } }

image.png

2025-11-01
C#
00

MessagePack 是一种高效的二进制序列化格式,特别适合于 C# 开发。与 JSON 和其他序列化格式相比,MessagePack 提供了更快的序列化和反序列化速度,适用于游戏、分布式计算和微服务等应用场景。本文将详细介绍如何在 C# 中使用 MessagePack,包括安装、基本用法和性能优化。

安装

MessagePack 可以通过 NuGet 安装。打开你的项目,使用以下命令安装 MessagePack 包:

Bash
Install-Package MessagePack

image.png

快速入门

定义可序列化的类

要使用 MessagePack 序列化自定义类型,首先需要定义一个类,并使用 [MessagePackObject] 属性标记它。类的属性需要使用 [Key] 属性标记,以指定序列化时的键。

C#
using MessagePack; [MessagePackObject] public class Sample { [Key(0)] public int Id { get; set; } [Key(1)] public string Name { get; set; } }
2025-11-01
C#
00

【导读】随着多核处理器成为主流,并行编程已成为提升应用性能的关键技术。本文深入介绍C#中的PLINQ(并行LINQ)技术,通过丰富的代码示例和详细解析,帮助开发者掌握这一强大的并行数据处理工具。无论你是初学者还是有经验的开发者,都能从中获益。

PLINQ基础:让数据处理飞起来

什么是PLINQ?

PLINQ(Parallel LINQ)是.NET Framework提供的并行数据处理库,它是LINQ(Language Integrated Query,语言集成查询)的并行扩展版本。PLINQ能够自动将数据处理操作分配到多个CPU核心上执行,充分利用现代多核处理器的计算能力,大幅提升数据处理性能。

PLINQ的核心优势

  • 开发效率高:使用熟悉的LINQ语法,只需添加简单的并行处理指令
  • 性能提升显著:自动利用多核处理器,加速数据处理
  • 易于集成:与现有LINQ代码无缝集成
  • 自动负载均衡:根据可用的处理器资源自动分配工作负载

PLINQ入门:从串行到并行的转变

创建第一个PLINQ查询

将普通LINQ查询转换为并行查询非常简单,只需添加.AsParallel()方法调用:

C#
namespace AppPLinq { internal class Program { static void Main(string[] args) { int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 普通LINQ查询 var normalQuery = numbers.Where(n => n % 2 == 0).Select(n => n * n); // PLINQ并行查询 - 仅添加AsParallel()方法 var parallelQuery = numbers.AsParallel() .Where(n => n % 2 == 0) .Select(n => n * n); foreach (var item in parallelQuery) { Console.WriteLine(item); } Console.ReadKey(); } } }

image.png

2025-11-01
C#
00

在开发Windows Forms应用程序时,DataGridView是我们常用的数据展示控件。但当需要加载大量数据(如十万、百万级记录)时,你可能会遇到性能瓶颈:界面卡顿、内存占用过高、加载时间过长。本文将系统讲解DataGridView大数据量下的性能优化策略,帮助你构建高效稳定的数据展示界面。

性能挑战分析

处理大数据量时,DataGridView主要面临以下挑战:

  • 内存占用过高:加载全部数据会占用大量内存
  • UI线程阻塞:数据加载时UI冻结,用户体验差
  • 渲染性能问题:大量行的渲染导致滚动卡顿

三种数据加载策略

根据不同应用场景,我们可以采用以下三种策略:

C#
// 数据加载策略 public enum LoadStrategy { Lazy, // 延迟加载:按需获取数据 Batch, // 分批加载:分段获取固定数量数据 Virtual // 虚拟模式:只加载可视区域数据 }

1. 延迟加载(Lazy Loading)

适合数据量中等的场景,用户触发特定动作时才加载数据。

2. 分批加载(Batch Loading)

适合需要全量数据但总量较大的情况,分多次加载固定数量的数据。

3. 虚拟模式(Virtual Mode)

适合海量数据展示,只加载可视区域数据,是本文重点讲解的优化方案。

虚拟模式实现详解

数据源接口设计

首先,我们定义一个通用的数据源接口:

C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AppEditDataGrid { // 数据源接口 public interface IDataSource<T> { // 获取指定范围的数据 List<T> GetData(int startIndex, int count); // 获取总记录数 int GetTotalCount(); } }

这个接口设计的关键在于:

  • 支持分段获取数据而非一次加载全部
  • 通过GetTotalCount()获取总记录数,告知GridView总行数