2009-05-01 21 views
1

是否容易编写一些.Net代码来记录屏幕和音频(从计算机话筒),然后输出到wmv文件。任何参考代码?使用Windows Media编码器记录屏幕

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

谢谢! George

+0

http://www.codeproject.com/KB/dialog/screencap.aspx?display=Print提到它反正... – rogerdpack 2010-07-27 21:41:17

回答

2

微软和内容mafi^H^H^H^Hindustry正在尽最大努力使这不可能。与浏览任何官方提供的文档/示例代码相比,您将更好地搜索“开源屏幕音频捕获” - 如果微软提供了任何相关的信息,我将会非常惊讶。

+0

@hlovdal,1。我只是用Google搜索“开源屏幕音频捕获” ,我找到了一些,但没有捕获屏幕到视频,而是捕获图像。 2.我阅读SDK文档WME,它提到了录制屏幕+音频是一项功能,但没有示例代码可以引用。我相信应该有一些。有任何想法吗? :-( – George2 2009-05-01 12:05:32

+0

不,我不知道任何细节 – hlovdal 2009-05-02 22:27:42

1

时退房SDK that's available for Techsmith Camtasia

的Camtasia是各种视频及音频信号源,编解码器等支持全屏桌面应用程序记录,他们的SDK,暴露出作为ActiveX控件(你可以调用从.NET很开心)。

+0

@Dylan,我找不到任何SDK文档或下载从Camtasia的网站链接你能找出 – George2 2009-05-01 12:02:11

+0

我道歉 - ?看来他们的SDK已经停产( http://www.techsmith.com/sdk.asp) 对不起。 – 2009-05-04 10:13:41

1

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

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

编辑:我有没有样品或经验的WME SDK。但我建议使用DirectShow路由来避免在主机系统上使用WME,缺乏对它的支持,以及只需了解DirectShow(或自己动手)而不是一些随机API。

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

一些示例代码是here

或者,如果您只想与DirectShow接口,最简单的方法是使用库为您执行COM交互。 http://directshownet.sourceforge.net/是一个很好的。

再次编辑:捕捉视频与捕捉帧相同。它每秒捕获帧30次。 CPU猪?这是,不要指望得到完整的帧率。

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

+0

@Nick,我会花一些时间来学习hmelyoff,我也想在同一时间来研究微软内置的解决方案。:-)其实我读了WME SDK文档,它提到它通过.Net代码支持屏幕捕获功能。但是我找不到任何样本代码,您是否有任何相关的源代码可供参考? – George2 2009-05-01 12:13:50

+0

另一个问题,我需要15分钟来研究hmelyoff,但我没有找到它描述的概念/ hmelyoff的架构和快速启动样本任何启动文件。我找到的所有示例代码和API的列表,对于初学者来说都不太好。你有任何这样的文件引用我阅读? :-) – George2 2009-05-01 12:19:20

+0

@Nick,谢谢你的评论。我的要求是不能捕捉屏幕为静态图像,但拍摄视频(我想捕获所有的Windows /鼠标的移动,以显示如何使用一些软件的一些演示)。我阅读CodeGuru文档,它似乎将捕获屏幕视为静态图像,而不是捕获视频? – George2 2009-05-01 13:26:19

0

最好的办法是将.net媒体编码器库导入到.net应用程序的com接口中,并将其用于您的应用程序中。

0

是的,这是完全可行的与WME: http://www.c-sharpcorner.com/UploadFile/armoghanasif/CaptureDesktopActivities11122005013755AM/CaptureDesktopActivities.aspx

我已经在过去做了,一旦你开始调整编码设置,你可以得到非常好的质量的视频。特别是如果WMV对你来说是一个可行的选择。如果没有,您将不得不使用其他应用程序重新编码为另一种格式。

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

0

您可以使用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(); 
     } 
    } 
+0

将代码添加到您的答案中是否值得显示OP如何实现? – Bugs 2016-11-15 11:35:32