當前位置: 妍妍網 > 碼農

WPF 使用 Accord 實作螢幕錄制

2024-03-05碼農

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(00, 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 == nullreturn;
    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

    [2]

    Accord 源碼地址: https://github.com/accord-net/framework