1

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

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

谢谢!乔治

4

6 回答 6

2

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

于 2009-05-01T11:17:34.040 回答
1

查看可用于 Techsmith Camtasia 的 SDK

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

于 2009-05-01T11:26:31.193 回答
1

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

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

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

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

一些示例代码在这里

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

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

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

于 2009-05-01T11:32:56.577 回答
0

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

于 2011-04-24T22:03:29.300 回答
0

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

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

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

于 2012-11-03T15:11:25.410 回答
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();
        }
    }
于 2016-11-15T11:14:54.760 回答