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屏幕录制的资料请关注代码网其它相关文章!
发表评论