如何使用 C# .Net 将屏幕捕获为视频?

Posted

技术标签:

【中文标题】如何使用 C# .Net 将屏幕捕获为视频?【英文标题】:How to capture screen to be video using C# .Net? 【发布时间】:2011-09-29 08:55:30 【问题描述】:

我知道有很多这样的问题。

但是我不想用Windows media encoder 9,因为拿到一个有问题,然后就不再支持了。

我知道,一种可能性是捕获大量屏幕截图并使用 ffmpeg 创建视频,但我不想使用第三方可执行文件。

有没有 .net 唯一的解决方案?

【问题讨论】:

您可以使用 Silverlight 4 来完成此任务,但不确定这是否适合您。 如果它可能是 .net 3.5 并且只有 winforms 我用的是Win7,但是软件应该在XP、Vista和W7下运行。目前我正在尝试 MS Expression Encoder 4 你检查过这个codeproject.com/kb/dotnet/wiascriptingdotnet.aspx 吗?它仅适用于 XP,但未在较新的操作系统上进行测试 我认为这仅适用于网络摄像头等外部设备?我想在桌面上捕获用户交互 【参考方案1】:

答案是Microsoft Expression Encoder。在我看来,这是在 vista 和 windows 7 上录制内容的最简单方法

private void CaptureMoni()
        

            try
            
                Rectangle _screenRectangle = Screen.PrimaryScreen.Bounds;
                _screenCaptureJob = new ScreenCaptureJob();
                _screenCaptureJob.CaptureRectangle = _screenRectangle;
                _screenCaptureJob.ShowFlashingBoundary = true;
                _screenCaptureJob.ScreenCaptureVideoProfile.FrameRate = 20;
                _screenCaptureJob.CaptureMouseCursor = true;

                _screenCaptureJob.OutputScreenCaptureFileName = string.Format(@"C:\test.wmv");
                if (File.Exists(_screenCaptureJob.OutputScreenCaptureFileName))
                
                    File.Delete(_screenCaptureJob.OutputScreenCaptureFileName);
                
                _screenCaptureJob.Start();
            
            catch(Exception e)  
        

【讨论】:

旧帖子,但我觉得我应该提一下,如果您想录制持续时间超过 10 分钟的视频,使用 Expression Encoder 需要专业许可证,而 GPU 编码也需要专业许可证。 (就我个人而言,没有 GPU 编码我无法得到任何输出) 感谢@masterchris_99 的回答。我也想使用 MEE,但得到以下错误; PCba.Tests.Repository.dll 中出现“System.IO.FileNotFoundException”类型的异常,但未在用户代码中处理其他信息:无法加载文件或程序集“Microsoft.Expression.Encoder,版本=4.0.0.0,文化=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。系统找不到指定的文件。【参考方案2】:

根据评论反馈进行编辑:

名为 baSSiLL 的开发人员慷慨地分享了一个存储库,其中包含一个屏幕录制 c# 库以及一个 c# 示例项目,展示了如何使用它来捕获屏幕和麦克风。

使用示例代码开始截屏非常简单:

recorder = new Recorder(_filePath,
            KnownFourCCs.Codecs.X264, quality,
            0, SupportedWaveFormat.WAVE_FORMAT_44S16, true, 160);

_filePath 是我要将视频保存到的文件的路径。

您可以传入各种编解码器,包括 AVI、MotionJPEG、X264 等。对于 x264,我必须先在我的机器上安装编解码器,但 AVI 开箱即用。

只有在使用 AVI 或 MotionJPEG 时,质量才会发挥作用。 x264 编解码器管理自己的质量设置。

上面的 0 是我想使用的音频设备。默认为零。

目前支持 2 种波形格式。 44100 16 位立体声或单声道。

true 参数表示我希望将音频编码为 mp3 格式。我相信在选择 x264 时这是必需的,因为在 .mp4 文件中组合的未压缩音频不会为我播放。

160 是编码音频的比特率。

~~~~~

要停止录制,您只需

recorder.Dispose(); recorder = null;

一切都是开源的,因此您可以编辑记录器类并更改尺寸、每秒帧数等。

~~~~

要启动并运行此库,您需要从下面的 github/codeplex 库下载或拉取。你也可以使用 NuGet:

安装包 SharpAvi

原帖:

夏普 AVI: https://sharpavi.codeplex.com/ 要么 https://github.com/baSSiLL/SharpAvi

该库中有一个示例项目,其中包含一个很棒的屏幕录像机以及用于设置/等的菜单。

我首先从这个 *** 问题的另一个答案中找到了 Screna,但我遇到了几个问题,涉及让 Mp3 Lame 编码器正常工作。 Screna 是 SharpAVI 的包装器。我发现通过删除 Screna 并关闭 SharpAvi 的样本,我的运气会更好。

【讨论】:

已经有一段时间了,但我相信 SharpAVI 有一个我无法重新创建的 LameEncoder 版本。我忘记了确切的问题,但认为每当我构建 LameEncoder 时,它都会丢失一些函数或者它是不同的方法名称等。我在 SharpAVI 中找到了实际的 DLL 文件,并且一旦我使用它就很顺利。 当我尝试将 Lame dll 文件与 Screna 一起使用时,方法中出现了匹配错误。就好像 Screna 使用的是不同版本的 lame。而且我无法重新创建所需的蹩脚 dll。

以上是关于如何使用 C# .Net 将屏幕捕获为视频?的主要内容,如果未能解决你的问题,请参考以下文章

视频捕获 + 上传 + 处理 + 流回 - .NET & C#

如何捕获视频并使用 C# 播放?

将屏幕截图捕获为图像然后使用 ffmpeg 将图像转换为视频文件的时间应该是啥?

C#如何使winform程序自适应屏幕分辨率显示

如何在 C# 中获取音频/视频和捕获设备列表?

如何将多个 WebRTC 媒体流(屏幕捕获 + 网络摄像头)混合/组合成一个流?