使用Windows Media Encoder记录屏幕

时间:2009-05-01 11:07:00

标签: windows screen media capture encoder

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

BTW:我搜索了WME SDK中的所有代码,没有这样的示例代码。

谢谢! 乔治

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

查看SDK that's available for Techsmith Camtasia

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

答案 2 :(得分: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接口才能执行此操作。

答案 3 :(得分:0)

您最好的选择是将Windows媒体编码器库作为.net应用程序中的com接口导入,并在您的应用程序中使用它。

答案 4 :(得分:0)

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

我过去已经完成了这项工作,一旦您开始调整编码设置,就可以获得质量非常好的视频。特别是如果WMV是一个可行的选择。如果不是,您必须使用其他应用程序重新编码为其他格式。

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

答案 5 :(得分: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();
        }
    }