开发者

WPF使用Accord实现屏幕录制功能

开发者 https://www.devze.com 2024-08-12 13:07 出处:网络 作者: WPF开发者
wpF 使用 Accord 实现屏幕录制 框架使用.NET4 Visual Studio 2022 WPF 实现调用 FFmpeg 实现屏幕录制

wpF 使用 Accord 实现屏幕录制

框架使用.NET4

Visual Studio 2022

WPF 实现调用 FFmpeg 实现屏幕录制

WPF 实现调用 WindowsAPI 实现屏幕录制

Accord 源码地址

此篇使用 Accord 实现屏幕录制,此次使用了三个库AccordAccord.VideoAccord.FFMPEG

Accord: 开源的机器学习框架,它提供了一系列用于数据处理、图像处理、机器学习和统计分析的工具和库。

Accord.Video:提供了处理视频数据,并提供了对视频文件的读取、处理和分析功能。

Accord.FFMPEG: 提供了对 FFmpeg 功能的封装和集成,提供音视频处理功能,如视频转码、格式转换、流媒体处理等。

WPF使用Accord实现屏幕录制功能

WPF使用Accord实现屏幕录制功能

使用的版本为 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, pythonscreenStream.FrameInterval);
            var videoBitRate = 1200 * 1000;
            videoWriter.Open(filePath, wijavascriptdth, 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 statphpic vandroidoid 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使用Accord实现屏幕录制功能的详细内容,更多关于WPF屏幕录制的资料请关注编程客栈(www.devze.com)其它相关文章!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号