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