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

 更新时间:2024年03月05日 10:50:55   作者:WPF开发者  
这篇文章主要为大家详细介绍了WPF如何使用Accord实现屏幕录制,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下

WPF 使用 Accord 实现屏幕录制

框架使用.NET4

Visual Studio 2022

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

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

Accord 源码地址

此篇使用 Accord 实现屏幕录制,此次使用了三个库AccordAccord.VideoAccord.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屏幕录制的资料请关注脚本之家其它相关文章!

相关文章

  • C# FileStream复制大文件

    C# FileStream复制大文件

    这篇文章主要为大家详细介绍了C# FileStream复制大文件的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C#中Socket通信用法实例详解

    C#中Socket通信用法实例详解

    这篇文章主要介绍了C#中Socket通信用法,以实例形式较为详细的分析了UDP及TCP两种通信方式的具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • 详解C#实现在Excel单元格中应用多种字体格式

    详解C#实现在Excel单元格中应用多种字体格式

    在Excel中,可对单元格中的字符串设置多种不同样式。本文,将以C#及VB.NET代码为例,介绍如何在Excel同一个单元格中应用多种字体样式,感兴趣的可以了解一下
    2022-05-05
  • C#中Kestrel和IIS服务器下的同步与异步配置

    C#中Kestrel和IIS服务器下的同步与异步配置

    本篇文章主要讲解什么是Kestrel和IIS服务器和特点,以及他们如何配置同步与异步,具有一定的参加价值,感兴趣的可以了解一下
    2023-08-08
  • C#中三种Timer计时器的详细用法

    C#中三种Timer计时器的详细用法

    这篇文章介绍了C#中三种Timer计时器的详细用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#中Equality和Identity浅析

    C#中Equality和Identity浅析

    这篇文章主要介绍了C#中Equality和Identity浅析,本文先是讲解了Equality和Identity的定义,同时讲解了判断两个对象等价性的4种方法,需要的朋友可以参考下
    2014-12-12
  • C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法

    C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法

    这篇文章主要介绍了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法,涉及C#遍历二叉树的相关技巧,需要的朋友可以参考下
    2015-04-04
  • WPF实现绘制3D图形的示例代码

    WPF实现绘制3D图形的示例代码

    WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D图形的渲染。本文主要讲述了WPF-3D中的关键概念, 以及常用到的命中测试、2d控件如何在3D对象中进行渲染,希望大家有所帮助
    2023-03-03
  • C#通过流写入数据到文件的方法

    C#通过流写入数据到文件的方法

    这篇文章主要介绍了C#通过流写入数据到文件的方法,涉及C#通过字节流读写文件的相关技巧,需要的朋友可以参考下
    2015-07-07
  • 基于C#调用OCX控件的常用方法(推荐)

    基于C#调用OCX控件的常用方法(推荐)

    下面小编就为大家分享一篇基于C#调用OCX控件的常用方法推荐,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论