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