您的位置:首页 > 其它

DirectX.Capture 类库(一捕获视频和音频到AVI文件的 .NET类库)

2010-03-31 12:05 337 查看
原文及代码附件地址:http://www.dingos.cn/index.php?topic=418.0



介绍

这篇文章主要描述在

.NET 环境下如何捕获视频和音频。此类库的主要特点如下:

列出且选择硬件设备

设置基本的音频和视频参数(如:帧速、大小)

支持音频和视频编码

支持视频预览

支持电视接收

支持混音

检索设备性能

显示驱动的属性页面

包含帮助文档

代码示例
Capture类是这个类库的核心。下面为一个简单的例子:

// Remember to add a reference to DirectX.Capture.dll
using DirectX.Capture

// Capture using the first video
// and audio devices available
Capture capture = new Capture( Filters.VideoInputDevices[0], Filters.AudioInputDevices[0]);

// Start capturing
capture.Start();

// Stop capturing
capture.Stop();

记得在你的项目中添加一DirectX.Capture.dll的引用。此DLL需要DShowNET.dll,所以必须确认此两个DLL都在同一个目录下。一旦你添加了此引用,Visual Studio .NET 将为你管理此DLL的一个拷贝。

此例子将采用系统的第一个视频和音频设备来采集视频和声音。若要单单只采集视频,只需要在构造函数的第二个参数传递null即可。

类初始化后,默认的捕获目标文件夹为Windows的temp文件夹中一个临时的文件,若要存储到不同的文件,在捕获前只要设置Capture.Filename属性即可。

第二个例子

这个例子描述如何改变视频和音频的设置。像Capture.FrameRateCapture.AudioSampleSize属性允许你通过程序调节捕获功能。Capture.VideoCapsCapture.AudioCaps会告诉你这些属性的有效值。

Capture capture = new Capture( Filters.VideoInputDevices[0], Filters.AudioInputDevices[1]);

capture.VideoCompressor = Filters.VideoCompressors[0];
capture.AudioCompressor = Filters.AudioCompressors[0];

capture.FrameRate = 29.997; // NTSC
capture.FrameSize = new Size( 640, 480 ); // 640x480
capture.AudioSamplingRate = 44100; // 44.1 kHz
capture.AudioSampleSize = 16; // 16-bit
capture.AudioChannels = 1; // Mono

capture.Filename = "C:/MyVideo.avi";

capture.Start();
...
capture.Stop();

上面的例子也描述如何使用视频和音频编码器。在多数情况下,你会使用编码器的。未编码的视频会每分钟轻松的消耗掉1GB的磁盘空间。只要可能,尽早设置Capture.VideoCompressorCapture.AudioCompressor属性。因为改变这些属性的值会导致大部分的属性重置成默认值。

幕后

这个项目使用100% DirectShow 来捕获视频。一旦捕获开始,DirectShow 自己会产生另外的线程来处理所有的视频和音频数据。意思即是说你可以用 C 来捕获相同速率和品质的视频和音频数据。

DirectShow 是一系列COM组件,我们用 .NET 托管来使用。这个工作已经由 NETMaster 编写的DShowNET 项目完成了。这个 Capture 类库在使用 DShowNET 作为托管层的基础上,只是增加了一些扩展。这就是早些时候谈及的 DShowNET.dll

上面的所有设置就是 Capture 类库。DirectShow 应用程序的核心就是 Filter GraphFilter Graph管理器。具体可见MSDN上的The Filter Graph and Its Components

可能的最少编程量

这个类库总是试着用尽可能的最少的编程量。问题是:DirectShow是非常复杂的,对驱动程序开发者来说几乎没有固定的标准,且我也只有有限的硬件来测试。结果是,此类不能避免兼容性的问题。

一个例子就是视频预览。你可以用下面的例子开开始和停止:

// Start preview
capture.PreviewWindow = myPanelControl;

// Stop preview
capture.PreviewWindow = null;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: