【问题标题】:using Windows Media Encoder to record screen使用 Windows Media Encoder 录制屏幕
【发布时间】:2010-10-23 02:21:17
【问题描述】:

编写一些 .Net 代码来录制屏幕和音频(来自计算机麦克风),然后输出到 wmv 文件是否容易。有参考代码吗?

顺便说一句:我从 WME SDK 中搜索了所有代码,没有这样的示例代码。

谢谢! 乔治

【问题讨论】:

标签: windows screen media capture encoder


【解决方案1】:

Microsoft 和内容 mafi^H^H^H^Hindustry 正在尽最大努力使这成为不可能。搜索“开源屏幕音频捕获”比浏览任何官方提供的文档/示例代码要好得多 - 如果 Microsoft 提供任何相关内容,我会感到非常惊讶。

【讨论】:

  • @hlovdal,1. 我刚刚搜索了“开源屏幕音频捕获”,我找到了一些,但不是将屏幕捕获到视频,而是捕获到图像。 2.我看了SDK文档WME,里面提到录屏+音频是一个特性,但是没有示例代码可以参考。我相信应该有一些。有任何想法吗? :-(
  • 不,我不知道任何细节。
【解决方案2】:

查看SDK that's available for Techsmith Camtasia

Camtasia 是一个全屏桌面录制应用程序,支持各种视频和音频源、编解码器等,他们的 SDK 将其公开为 ActiveX 控件(您可以很高兴地从 .NET 调用它)。

【讨论】:

  • @Dylan,我在 Camtasia 网站上找不到任何 SDK 文档或下载链接。你能找出来吗?
  • 我很抱歉 - 他们的 SDK 似乎已停产 (techsmith.com/sdk.asp) 抱歉。
【解决方案3】:

有用于屏幕捕获的 DirectShow 兼容过滤器。这将允许您使用任何录制程序来捕获屏幕内容或自己在 .NET 中编写应用程序(但这并不容易)。

我使用的是: http://www.hmelyoff.com/index.php?section=9

编辑:我没有 WME SDK 的示例或经验。但我建议采用 DirectShow 路线,以避免在主机系统上有 WME 的要求,缺乏对它的支持,并且了解 DirectShow(或自己做)而不是一些随机的 API 很好。

要使用 Hmelyoff 过滤器,它就像一个网络摄像头一样工作。它只是可供任何需要视频输入的应用程序使用的另一个视频捕获源。它的工作原理是将视频缓冲区的一部分复制到每帧上的输出引脚(使用 BitBlt 等 API 函数)。

一些示例代码是here

或者,如果您只想与 DirectShow 交互,最简单的方法是使用库为您进行 COM 交互。 http://directshownet.sourceforge.net/ 不错。

再次编辑:捕获为视频与捕获帧相同。它每秒只捕获 30 次帧。占用CPU?是的,不要期望获得完整的帧速率。

如果您要问的是如何将帧保存为视频,那么您需要将数据传递给视频编码器。您需要与 DirectShow 交互才能执行此操作。

【讨论】:

  • @Nick,我要花点时间研究一下hmelyoff,同时我也想研究一下微软的内置解决方案。 :-) 实际上我阅读了 WME SDK 文档,它提到它通过 .Net 代码支持屏幕捕获功能。但是我找不到任何示例代码,您有任何相关的源代码可以参考吗?
  • 另一个问题,我花了 15 分钟研究 hmelyoff,但我没有找到任何描述 hmelyoff 的概念/架构和快速入门示例的启动文档。我找到的只是示例代码和 API 的列表,它们对初学者来说不太好。你有什么这类文件可以推荐给我看吗? :-)
  • @Nick,感谢您的 cmets。我的要求不是将屏幕捕获为静态图像,而是捕获为视频(我想捕获所有窗口/鼠标的移动以展示如何使用某些软件的一些演示)。我阅读了 CodeGuru 文档,它似乎将捕获屏幕作为静态图像处理,而不是作为视频捕获?
  • @Nick,使用 DirectShow 对我来说很好。您能否推荐一些.Net源代码(对视频进行屏幕录制)供我参考?
【解决方案4】:

最好的办法是将 windows 媒体编码器库作为 .net 应用程序中的 com 接口导入并在应用程序中使用。

【讨论】:

    【解决方案5】:

    是的,WME 完全可以做到这一点: http://www.c-sharpcorner.com/UploadFile/armoghanasif/CaptureDesktopActivities11122005013755AM/CaptureDesktopActivities.aspx

    我过去做过,一旦开始调整编码设置,您就可以获得质量非常好的视频。特别是如果 WMV 对您来说是一个可行的选择。如果不是,您必须使用另一个应用程序重新编码为另一种格式。

    我发现调整的最简单方法是使用 WME 桌面应用程序以不同的设置进行测试和记录,然后保存这些配置文件,这些文件我后来以编程方式从我的应用程序中加载。

    【讨论】:

      【解决方案6】:

      您可以使用 Microsoft Expression Encoder 4 来录制视频和音频。它只适用于 C#。 下面的代码应该很熟悉了。

      void Encode(string jobPath)
          {
              using (Job j = new Job())
              {
      
                  MediaItem mediaItem = new MediaItem(jobPath);
                  var size = mediaItem.OriginalVideoSize;
                  WindowsMediaOutputFormat WMV_Format = new WindowsMediaOutputFormat();
                  WMV_Format.VideoProfile = new Microsoft.Expression.Encoder.Profiles.AdvancedVC1VideoProfile();
                  WMV_Format.AudioProfile = new Microsoft.Expression.Encoder.Profiles.WmaAudioProfile();
                  WMV_Format.VideoProfile.AspectRatio = new System.Windows.Size(16, 9);
                  WMV_Format.VideoProfile.AutoFit = true;
      
                  if (size.Width >= 1920 && size.Height >= 1080)
                  {
                      WMV_Format.VideoProfile.Size = new System.Drawing.Size(1920, 1080);
                      WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(6000);
                  }
                  else if (size.Width >= 1280 && size.Height >= 720)
                  {
                      WMV_Format.VideoProfile.Size = new System.Drawing.Size(1280, 720);
                      WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(4000);
                  }
                  else
                  {
                      WMV_Format.VideoProfile.Size = new System.Drawing.Size(size.Width, size.Height);
                      WMV_Format.VideoProfile.Bitrate = new Microsoft.Expression.Encoder.Profiles.VariableUnconstrainedBitrate(2000);
                  }
                  mediaItem.VideoResizeMode = VideoResizeMode.Letterbox;
                  mediaItem.OutputFormat = WMV_Format;
                  j.MediaItems.Add(mediaItem);
                  j.CreateSubfolder = false;
                  j.OutputDirectory = @"D:\output";
                  j.EncodeProgress += new EventHandler<EncodeProgressEventArgs>(j_EncodeProgress);
                  j.Encode();
              }
          }
      

      【讨论】:

      • 不值得将代码包含在您的答案中,向 OP 展示您是如何实现这一目标的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多