WPF使用Accord实现屏幕录制功能
作者:WPF开发者
这篇文章主要为大家详细介绍了WPF如何使用Accord实现屏幕录制,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
WPF 使用 Accord 实现屏幕录制
框架使用.NET4
Visual Studio 2022
此篇使用 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; namespace DesktopRecord.Helper { public class AccordHelper { static ScreenCaptureStream screenStream; static VideoFileWriter videoWriter; public static void Start() { 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(); } private static void ScreenStream_NewFrame(object sender, NewFrameEventArgs eventArgs) { if (videoWriter == null) return; videoWriter.WriteVideoFrame(eventArgs.Frame); } public static void Stop() { 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
代码如下:
<TabItem Height="35" Header="WindowsAPI 录制"> <view:CommOptionView> <view:CommOptionView.DataContext> <vm:MainVM RecordEnums="WindowsAPI" /> </view:CommOptionView.DataContext> </view:CommOptionView> </TabItem> <TabItem Height="35" Header="Accord 录制"> <view:CommOptionView> <view:CommOptionView.DataContext> <vm:MainVM RecordEnums="Accord" /> </view:CommOptionView.DataContext> </view:CommOptionView> </TabItem>
效果图
以上就是WPF使用Accord实现屏幕录制功能的详细内容,更多关于WPF屏幕录制的资料请关注脚本之家其它相关文章!