共计 1945 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
在开发桌面录屏功能时,C# 开发者常面临以下挑战:

- 音视频同步困难:手动处理音频和视频的时间戳容易导致不同步
- 性能瓶颈:纯 C# 实现的录屏方案往往 CPU 占用率高
- 编码兼容性问题:生成的视频文件在不同设备上播放可能出现兼容性问题
- 功能完整性:同时捕获系统音频和麦克风输入需要复杂处理
技术选型对比
- DirectX/Windows API 方案
- 优点:直接调用系统 API,性能较好
-
缺点:开发复杂度高,跨平台兼容性差
-
第三方 C# 库方案
- 优点:API 友好,开发快捷
-
缺点:功能受限,难以定制
-
FFmpeg 方案
- 优点:功能全面,参数灵活,跨平台支持
- 缺点:需要学习命令行参数
综合考虑开发效率和功能需求,FFmpeg 是最佳选择。
核心实现
基本环境准备
- 下载 FFmpeg 静态编译版本
- 将 ffmpeg.exe 放置在项目目录下
- 添加 System.Diagnostics 命名空间引用
完整代码示例
public class ScreenRecorder
{
private Process ffmpegProcess;
private string outputPath;
public void StartRecording(string outputFilePath)
{
outputPath = outputFilePath;
var ffmpegArgs = $"-f gdigrab -framerate 30 -i desktop" +
$"-f dshow -i audio=" 虚拟音频采集器 " " +
$"-c:v libx264 -crf 28 -preset ultrafast" +
$"-c:a aac -b:a 128k" +
$"-pix_fmt yuv420p" +
$""{outputPath}"";
var startInfo = new ProcessStartInfo
{
FileName = "ffmpeg.exe",
Arguments = ffmpegArgs,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true
};
ffmpegProcess = new Process {StartInfo = startInfo};
ffmpegProcess.Start();}
public void StopRecording()
{if (ffmpegProcess != null && !ffmpegProcess.HasExited)
{ffmpegProcess.StandardInput.WriteLine("q");
ffmpegProcess.WaitForExit(3000);
if (!ffmpegProcess.HasExited)
{ffmpegProcess.Kill();
}
ffmpegProcess.Dispose();
ffmpegProcess = null;
}
}
}
参数详解
- 视频采集参数
-f gdigrab:使用 Windows 图形设备接口抓取桌面-framerate 30:设置帧率为 30FPS-
-i desktop:捕获整个桌面 -
音频采集参数
-f dshow:使用 DirectShow 采集音频-
audio="虚拟音频采集器":指定音频输入设备 -
编码参数
-c:v libx264:使用 H.264 视频编码-crf 28:质量参数(18-28 为常用范围)-preset ultrafast:编码速度优先-c:a aac:使用 AAC 音频编码-b:a 128k:音频比特率
性能优化
- 硬件加速
- 添加
-hwaccel auto参数启用硬件加速 -
支持 NVENC/QSV 等显卡编码器
-
多线程处理
-
添加
-threads 4参数指定线程数 -
内存优化
-
使用
-bufsize和-maxrate控制码率波动 -
分段录制
- 定时分段写入文件,避免单个文件过大
避坑指南
- FFmpeg 路径问题
- 建议将 ffmpeg.exe 放在项目根目录
-
或者使用绝对路径
-
音频设备不可用
- 使用
ffmpeg -list_devices true -f dshow -i dummy列出可用设备 -
可能需要安装虚拟音频设备
-
权限问题
- 确保程序有访问音频设备的权限
-
管理员权限可能要求
-
文件写入失败
- 检查输出目录是否存在
- 确保有写权限
功能扩展思路
- 添加水印
-
使用
-vf "movie=watermark.png [wm];[in][wm] overlay=10:10"参数 -
直播推流
- 修改输出为 RTMP 地址
-
添加
-f flv格式参数 -
区域录制
-
修改
-i desktop为-i title= 窗口标题或指定坐标 -
麦克风采集
- 添加额外的音频输入源
总结
通过 FFmpeg 实现桌面录制,我们获得了:
- 成熟的音视频处理能力
- 灵活的配置选项
- 良好的性能表现
这种方案特别适合需要快速实现稳定录屏功能的场景。后续可以根据实际需求,继续扩展更多高级功能。
建议开发者深入学习 FFmpeg 的参数配置,掌握更多音视频处理技巧,这将大大提升多媒体应用的开发效率。
正文完
