WPF 使用 Accord 实现屏幕录制
控件名:DesktopRecord
作 者:WPFDevelopersOrg - 驚鏵
原文链接 [1] :https://github.com/yanjinhuagood/DesktopRecord
框架使用
.NET4
Visual Studio 2022
Accord 源码地址 [2]
此篇使用
Accord
实现屏幕录制,此次使用了三个库
Accord
、
Accord.Video
、
Accord.FFMPEG
Accord
: 开源的机器学习框架,它提供了一系列用于数据处理、图像处理、机器学习和统计分析的工具和库。
Accord.Video
:提供了处理视频数据,并提供了对视频文件的读取、处理和分析功能。
Accord.FFMPEG
: 提供了对
FFmpeg
功能的封装和集成,提供音视频处理功能,如视频转码、格式转换、流媒体处理等。
使用的版本为
3.8.0
1)新增
AccordHelper
代码如下:
定义
ScreenCaptureStream
对象用于捕获屏幕内容。
定义了一个
VideoFileWriter
对象用于将捕获到的屏幕内容写入视频文件。
在
Start()
方法中,创建
ScreenCaptureStream
对象,并指定捕获屏幕的区域为
整个屏幕
。
然后再创建了一个
VideoFileWriter
对象,并指定了输出视频文件的
路径
、
宽度
、
高度
、
帧率
、
视频编解码器
和
比特率
。
设置捕获屏幕帧的间隔为
40
毫秒。
设置视频比特率为
1200 * 1000
,如果设置较高的比特率视频会更加清晰,但是文件也会相对增大。
注册了
NewFrame
事件处理程序,当有新的帧捕获时,将该帧就写入视频文件。
在
Stop()
方法中,检查
screenShot
和
videoWriter
是否为
null
,如果不为
null
,则分别停止屏幕捕获和关闭视频写入。
using Accord.Math;
using Accord.Video;
using Accord.Video.FFMPEG;
using System;
using System.Windows;
namespaceDesktopRecord.Helper
{
public classAccordHelper
{
static ScreenCaptureStream screenStream;
static VideoFileWriter videoWriter;
publicstaticvoidStart()
{
var workArea = SystemParameters.WorkArea.Size;
var width = (int)workArea.Width;
var height = (int)workArea.Height;
var rectangle = new System.Drawing.Rectangle(0, 0, width, height);
screenStream = new ScreenCaptureStream(rectangle);
videoWriter = new VideoFileWriter();
var filePath = $"{Environment.CurrentDirectory}/DesktopRecord_{DateTime.Now.ToString("yyyyMMddHHmmss")}.avi";
var framerate = new Rational(1000, screenStream.FrameInterval);
var videoBitRate = 1200 * 1000;
videoWriter.Open(filePath, width, height, framerate, VideoCodec.MSMPEG4v3, videoBitRate);
screenStream.FrameInterval = 40;
screenStream.NewFrame += ScreenStream_NewFrame;
screenStream.Start();
}
privatestaticvoidScreenStream_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (videoWriter == null) return;
videoWriter.WriteVideoFrame(eventArgs.Frame);
}
publicstaticvoidStop()
{
if (screenStream != null)
{
screenStream.Stop();
screenStream = null;
}
if (videoWriter != null)
{
videoWriter.Close();
videoWriter.Dispose();
videoWriter = null;
}
}
}
}
2)新增
CommOptionView.xaml
代码如下:
<UserControl
x: class="DesktopRecord.View.CommOptionView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:DesktopRecord.View"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wd="https://github.com/WPFDevelopersOrg/WPFDevelopers"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<Grid>
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Horizontal">
<Button
Margin="0,0,5,0"
Command="{Binding RecordCommand}"
Content="开始录制"
style="{StaticResource WD.SuccessPrimaryButton}" />
<Button
Margin="5,0,0,0"
wd:Loading.IsShow="{Binding IsShow}"
wd:Loading.LoadingType="Normal"
Command="{Binding RecordStopCommand}"
Content="停止录制"
style="{StaticResource WD.DangerPrimaryButton}" />
</StackPanel>
</Grid>
</UserControl>
3)修改
MainWindow.xaml
代码如下:
<TabItemHeight="35"Header="WindowsAPI 录制">
<view:CommOptionView>
<view:CommOptionView.DataContext>
<vm:MainVMRecordEnums="WindowsAPI" />
</view:CommOptionView.DataContext>
</view:CommOptionView>
</TabItem>
<TabItemHeight="35"Header="Accord 录制">
<view:CommOptionView>
<view:CommOptionView.DataContext>
<vm:MainVMRecordEnums="Accord" />
</view:CommOptionView.DataContext>
</view:CommOptionView>
</TabItem>
参考资料
[1]
原文链接:
https://github.com/yanjinhuagood/DesktopRecord
Accord 源码地址:
https://github.com/accord-net/framework