以下来自:[url]http://www.codeproject.com/cs/media/directxcapture.asp[/url]
我简单翻译下,帮助以下英文不太好的朋友
提供示例下载:
[url]http://files.cnblogs.com/mgod/DirectXCapture_src.zip[/url]
[url]http://files.cnblogs.com/mgod/DirectXCapture_demo.zip[/url]
[url]http://files.cnblogs.com/mgod/DirectXCapture_src.zip[/url]
[url]http://files.cnblogs.com/mgod/DirectXCapture_demo.zip[/url]
description:
现在我就把我用的类库,介绍给大家。DirectX.Capture Class Library
(By Brian Low.)是我在codeproject上寻找的类库,它完全由C#编写,基于directshow.net类库,用于实现音频和视频的捕捉,并且可以保存为avi文件,你可以很方便的在codeproject上下载到这两个类库的源文件。
该类库的主要特点:
- 可以列举和选择所有音视频的硬件设备
- 可以设置音频和视频相关属性,例如帧速率,大小,采样频率等
- 支持音视频压缩编码
- 支持视频预览
- 支持电视接口
- 支持混音
- 可以显示硬件驱动的属性
- 包含了标准的MSDN式的帮助文档
DirectX.Capture.dll和
DShowNET.dll
,到你的项目里。
例程1:
using DirectX.Capture
// 此时使用默认的音视频的首选设备进行捕获
Capture capture = new Capture( Filters.VideoInputDevices[0],
Filters.AudioInputDevices[0] );
// Start capturing
capture.Start();
// Stop capturing
capture.Stop();
例程2:
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();
例程3:关于预览
// Start preview
capture.PreviewWindow = myPanelControl;
// Stop preview
capture.PreviewWindow = null;
该类库每次都会从设备的驱动程序中更新最新支持的属性,因此你完全没有必要理会,设备到底是不是支持特定属性,只要从支持的属性中选择即可
当然该类库,也有一些问题,比如说关于电视卡的支持并不是很好,但是如果你不用的话,仅仅操作普通的视频和音频设备,该类库还是非常好用的,
---------------------原文如下------------------------------
Introduction
This article presents a class library for capturing audio and video to AVI files in .NET. Some of the features of this library:
- List and select hardware devices
- Access to common audio and video settings (e.g. frame rate, size)
- Support audio and video compression codecs
- Support video preview
- Support TV tuners
- Support crossbars and audio mixers
- Retrieve device capabilities
- Show property pages exposed by drivers
- MSDN-style documentation included
Using the Code
The
Capture
class is the core of this library. Here is a simple example:
// 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();
Remember to add a reference in your project to
DirectX.Capture.dll. This DLL requires
DShowNET.dll, so make sure they are both in the same directory. Once you add the reference, Visual Studio .NET should take care of the copying for you.
This example will capture video and audio using the first video and audio devices installed on the system. To capture video only, pass a
null
as the second parameter to the constructor.
The class is initialized to a valid temporary file in the Windows
temp folder. To capture to a different file, set the
Capture.Filename
property before you begin capturing.
A Second Example
This next example shows how to change video and audio settings. Properties such as
Capture.FrameRate
and
Capture.AudioSampleSize
allow you to programmatically adjust the capture. Use
Capture.VideoCaps
and
Capture.AudioCaps
to determine valid values for these properties.
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();
The example above also shows the use of video and audio compressors. In most cases, you will want to use compressors. Uncompressed video can easily consume over 1GB of disk space per minute. Whenever possible, set the
Capture.VideoCompressor
and
Capture.AudioCompressor
properties as early as possible. Changing them requires the internal filter graph to be rebuilt which often causes most of the other properties to be reset to default values.
Behind the Scenes
This project uses 100% DirectShow to capture video. Once a capture is started, DirectShow spawns another thread and handles retrieving/moving all the video and audio data itself. That means you should be able to capture at the same speed and quality as an application written in C.
DirectShow is implemented as a set of COM components and we use .NET Interop to access them. The pioneering work on this was done by NETMaster with the
DShowNET project. This
Capture
library uses DShowNET for the interop layer with only a few extensions. This is the
DShowNET.dll mentioned earlier.
Sitting on top of all of this is the
Capture
class library. The center of any DirectShow app is the filter graph and the filter graph manager. For a good overview, see
The Filter Graph and Its Components from the MSDN.
The Least Work Possible
The library tries at all times to do the least amount of work possible. The problem is: DirectShow is very flexible, but has few firm standards for driver developers and I have limited hardware to test with. As a result, the class tries to avoid doing any work that may not be necessary, hopefully avoiding potential incompatibilities in the process.
One example is video preview. You can start and stop preview with:
// Start preview capture.PreviewWindow = myPanelControl; // Stop preview capture.PreviewWindow = null;
Hopefully this is simple to use. Internally, DirectShow does a lot of work: add required upstream filters for WDM devices, search for preview pins, use the Overlay Manager for video ports (hardware overlays), insert SmartTee filters when a separate preview pin is not available and more. Instead of rendering the preview stream as soon as the class is created, the class waits until the
PreviewWindow
property is set.
For developers who don't need preview, none of this work will ever be done. That means your application is more likely to work on a wider range of hardware. For developers that do need preview, this makes it easier to locate the cause of the problem and fix it or handle it gracefully.
Performance Tips
Many of the properties on the
Capture
class are retrieved directly from the underlying DirectShow COM components. If you need to refer to the property repeatedly in a block of code, take a copy of the value and use your copy.
// AudioSampleSize is retrieved from DirectShow each iteration for ( int c = 0; c < 32; c++ ) { if ( c == capture.AudioSampleSize ) MessageBox.Show( "Found!" ); } // A faster solution int x = capture.AudioSampleSize; for ( int c = 0; c < 32; c++ ) { if ( c == x ) MessageBox.Show( "Found!" ); }
Why doesn't the class simply cache the value internally? We don't know when the filter (device driver) will change this value, so we have to retrieve the value every time. This means you will always get the real value of the property.
Credits
The DirectShow interop layer was developed by NETMaster in the
DShowNET project. The MDSN-style documentation was generated from the source code using
nDoc.
Troubleshooting
I have tested this with an Asus v7700 (NVidia GeForce2, reference drivers) and my onboard sound card. I can't guarantee any other hardware will work. However, I expect most video capture cards and sound cards will work. You may have trouble with TV Tuner cards and DV devices (Firewire camcorders) though they should be solvable.
Try the
AMCap sample from the DirectX SDK (
DX9\Samples\C++\DirectShow\Bin\AMCap.exe) or
Virtual VCR, a free DirectShow capture application.
This class library uses COM Interop to access the full capabilities of DirectShow, so if there is another application that can successfully use a hardware device then it should be possible to modify this class library to use the device. Please post your experiences, good or bad, in the forum below.
User Enhancements
The following enhancements have been posted to the discussion board:
- Frequency Overrides for the Tuner class by fdaupias
- Radio Tuning for the Tuner class by dauboro
Thanks to fdaupias and dauboro for their submissions. I have not had time to post a tested, updated version with these enhancements. If anyone wants to make an updated download zip, mail it to me and I will added it to this page. Keep the enhancements coming.
DirectX.Capture Wiki
A Wiki for this project is available
here. This Wiki can be edited by anyone, no registration is required. I hope this Wiki will allow interested users to more easily collaborate on this project. New versions, enhancements, tips and tricks can be posted on the Wiki.
License
This article, along with any associated source code and files, is licensed under
A Public Domain dedication