编写一些 .Net 代码来记录屏幕和音频(来自计算机麦克风),然后输出到 wmv 文件是否容易。有参考代码吗?
顺便说一句:我从 WME SDK 中搜索了所有代码,没有这样的示例代码。
谢谢!乔治
微软和内容 mafi^H^H^H^Hindustry 正在尽最大努力使这成为不可能。搜索“开源屏幕音频捕获”比浏览任何官方提供的文档/示例代码要好得多 - 如果 Microsoft 提供任何相关内容,我会感到非常惊讶。
查看可用于 Techsmith Camtasia 的 SDK:
Camtasia 是一个全屏桌面录制应用程序,支持各种视频和音频源、编解码器等,他们的 SDK 将其公开为 ActiveX 控件(您可以非常愉快地从 .NET 调用它)。
有用于屏幕捕获的 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 交互来执行此操作。
您最好的选择是将 windows 媒体编码器库作为 .net 应用程序中的 com 接口导入并在您的应用程序中使用它。
是的,这完全可以使用 WME: http ://www.c-sharpcorner.com/UploadFile/armoghanasif/CaptureDesktopActivities11122005013755AM/CaptureDesktopActivities.aspx
我过去做过,一旦你开始调整编码设置,你就可以获得质量非常好的视频。特别是如果 WMV 对您来说是一个可行的选择。如果不是,您必须使用另一个应用程序重新编码为另一种格式。
我发现调整的最简单方法是使用 WME 桌面应用程序以不同的设置进行测试和记录,然后保存这些配置文件,这些文件我后来以编程方式从我的应用程序中加载。
您可以使用 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();
}
}