提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
初学C#,记录一个利用nuget提供的三方库Accord.Video.FFMPEG实现录屏功能
提示:以下是本篇文章正文内容,下面案例可供参考
一、代码
public class ScreenRecorder
{
private VideoFileWriter writer;
public bool isRecording;
public enum VideoQuality
{
Low = 0,
Medium = 1,
High = 2
}
/// <summary>
/// 开始录屏,用于手动开始记录视频
/// </summary>
/// <param name="outputPath">存储文件地址,例如:@"C:\Users\Guo\Desktop\视频一.mp4"</param>
/// <param name="width">录屏宽度</param>
/// <param name="height">录屏高度</param>
/// <param name="quality">存储视频质量,质量越高占用控件越大,</param>
/// <param name="fps">fps</param>
public void StartRecord(string outputPath, int width, int height, VideoQuality quality = VideoQuality.Medium, int fps = 20)
{
if (isRecording)
return;
writer = new VideoFileWriter();
switch (quality)
{
case VideoQuality.Low:
writer.Open(outputPath, width, height, fps);
break;
case VideoQuality.Medium:
writer.Open(outputPath, width, height, fps, VideoCodec.Default, 500000);
break;
case VideoQuality.High:
writer.Open(outputPath, width, height, fps, VideoCodec.Default, 1000000);
break;
}
isRecording = true;
Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
Task.Run(() =>
{
while (isRecording)
{
g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
writer.WriteVideoFrame(bitmap);
Thread.Sleep(10);
}
writer.Close();
});
}
/// <summary>
/// 按照时间间隔自动存储到制定文件夹
/// </summary>
/// <param name="folderPath">文件夹目录</param>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="timeSpan_minut">时间间隔,单位是分钟</param>
/// <param name="quality">存储视频质量</param>
/// <param name="fps"></param>
public void TimespanRecord(string folderPath, int width, int height, double timeSpan_minut, VideoQuality quality = VideoQuality.Medium, int fps = 20)
{
if (isRecording)
return;
if (!Directory.Exists(folderPath))//文件夹路径有错
return;
Task.Run(() =>
{
if (folderPath.Substring(folderPath.Length - 1) != "\\")//完善文件路径
folderPath += "\\";
isRecording = true;
writer = new VideoFileWriter();
DateTime lastTimePoint = DateTime.Now;//时间标签,用于计算间隔
string outputPath = folderPath + lastTimePoint.ToString("yyyyMMdd_HHmmss") + ".mp4";//文件命名
Bitmap bitmap = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bitmap);
switch (quality)
{
case VideoQuality.Low:
writer.Open(outputPath, width, height, fps);
break;
case VideoQuality.Medium:
writer.Open(outputPath, width, height, fps, VideoCodec.Default, 500000);
break;
case VideoQuality.High:
writer.Open(outputPath, width, height, fps, VideoCodec.Default, 1000000);
break;
}
while (isRecording) // 假设你有一个isRecording标志来控制录制
{
if (DateTime.Now.Subtract(lastTimePoint).Duration().TotalSeconds > timeSpan_minut * 60)
{
writer.Close();
lastTimePoint = DateTime.Now;
outputPath = folderPath + lastTimePoint.ToString("yyyyMMdd_HHmmss") + ".mp4";
switch (quality)
{
case VideoQuality.Low:
writer.Open(outputPath, width, height, fps);
break;
case VideoQuality.Medium:
writer.Open(outputPath, width, height, fps, VideoCodec.Default, 500000);
break;
case VideoQuality.High:
writer.Open(outputPath, width, height, fps, VideoCodec.Default, 1000000);
break;
}
continue;
}
g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
writer.WriteVideoFrame(bitmap);
Thread.Sleep(10);
}
writer.Close();
});
}
/// <summary>
/// 停止录屏
/// </summary>
public void StopRecord()
{
isRecording = false;
}
}
总结
nothing