📄 capture.cs
字号:
get { return( previewWindow ); }
set
{
assertStopped();
derenderGraph();
previewWindow = value;
wantPreviewRendered = ( ( previewWindow != null ) && ( videoDevice != null ) );
renderStream = false;
renderGraph();
startPreviewIfNeeded();
}
}
/// <summary>
/// The capabilities of the video device.
/// </summary>
/// <remarks>
/// It may be required to cue the capture (see <see cref="Cue"/>)
/// before all capabilities are correctly reported. If you
/// have such a device, the developer would be interested to
/// hear from you.
///
/// <para>
/// The information contained in this property is retrieved and
/// cached the first time this property is accessed. Future
/// calls to this property use the cached results. This was done
/// for performance. </para>
///
/// <para>
/// However, this means <b>you may get different results depending
/// on when you access this property first</b>. If you are experiencing
/// problems, try accessing the property immediately after creating
/// the Capture class or immediately after setting the video and
/// audio compressors. Also, inform the developer. </para>
/// </remarks>
public VideoCapabilities VideoCaps
{
get
{
if ( videoCaps == null )
{
if ( videoStreamConfig != null )
{
try
{
videoCaps = new VideoCapabilities( videoStreamConfig );
}
catch ( Exception ex ) { Debug.WriteLine( "VideoCaps: unable to create videoCaps." + ex.ToString() ); }
}
}
return( videoCaps );
}
}
/// <summary>
/// The capabilities of the audio device.
/// </summary>
/// <remarks>
/// It may be required to cue the capture (see <see cref="Cue"/>)
/// before all capabilities are correctly reported. If you
/// have such a device, the developer would be interested to
/// hear from you.
///
/// <para>
/// The information contained in this property is retrieved and
/// cached the first time this property is accessed. Future
/// calls to this property use the cached results. This was done
/// for performance. </para>
///
/// <para>
/// However, this means <b>you may get different results depending
/// on when you access this property first</b>. If you are experiencing
/// problems, try accessing the property immediately after creating
/// the Capture class or immediately after setting the video and
/// audio compressors. Also, inform the developer. </para>
/// </remarks>
public AudioCapabilities AudioCaps
{
get
{
if ( audioCaps == null )
{
if ( audioStreamConfig != null )
{
try
{
audioCaps = new AudioCapabilities( audioStreamConfig );
}
catch ( Exception ex ) { Debug.WriteLine( "AudioCaps: unable to create audioCaps." + ex.ToString() ); }
}
}
return( audioCaps );
}
}
/// <summary>
/// The video capture device filter. Read-only. To use a different
/// device, dispose of the current Capture instance and create a new
/// instance with the desired device.
/// </summary>
public Filter VideoDevice { get { return( videoDevice ); } }
/// <summary>
/// The audio capture device filter. Read-only. To use a different
/// device, dispose of the current Capture instance and create a new
/// instance with the desired device.
/// </summary>
public Filter AudioDevice { get { return( audioDevice ); } }
/// <summary>
/// The video compression filter. When this property is changed
/// the internal filter graph is rebuilt. This means that some properties
/// will be reset. Set this property as early as possible to avoid losing
/// changes. This property cannot be changed while capturing.
/// </summary>
public Filter VideoCompressor
{
get { return( videoCompressor ); }
set
{
assertStopped();
destroyGraph();
videoCompressor = value;
renderGraph();
startPreviewIfNeeded();
}
}
/// <summary>
/// The audio compression filter.
/// </summary>
/// <remarks>
/// When this property is changed
/// the internal filter graph is rebuilt. This means that some properties
/// will be reset. Set this property as early as possible to avoid losing
/// changes. This property cannot be changed while capturing.
/// </remarks>
public Filter AudioCompressor
{
get { return( audioCompressor ); }
set
{
assertStopped();
destroyGraph();
audioCompressor = value;
renderGraph();
startPreviewIfNeeded();
}
}
/// <summary>
/// The current video source. Use Capture.VideoSources to
/// list available sources. Set to null to disable all
/// sources (mute).
/// </summary>
public Source VideoSource
{
get { return( VideoSources.CurrentSource ); }
set { VideoSources.CurrentSource = value; }
}
/// <summary>
/// The current audio source. Use Capture.AudioSources to
/// list available sources. Set to null to disable all
/// sources (mute).
/// </summary>
public Source AudioSource
{
get { return( AudioSources.CurrentSource ); }
set { AudioSources.CurrentSource = value; }
}
/// <summary>
/// Collection of available video sources/physical connectors
/// on the current video device.
/// </summary>
/// <remarks>
/// In most cases, if the device has only one source,
/// this collection will be empty.
///
/// <para>
/// The information contained in this property is retrieved and
/// cached the first time this property is accessed. Future
/// calls to this property use the cached results. This was done
/// for performance. </para>
///
/// <para>
/// However, this means <b>you may get different results depending
/// on when you access this property first</b>. If you are experiencing
/// problems, try accessing the property immediately after creating
/// the Capture class or immediately after setting the video and
/// audio compressors. Also, inform the developer. </para>
/// </remarks>
public SourceCollection VideoSources
{
get
{
if ( videoSources == null )
{
try
{
if ( videoDevice != null )
videoSources = new SourceCollection( captureGraphBuilder, videoDeviceFilter, true );
else
videoSources = new SourceCollection();
}
catch ( Exception ex ) { Debug.WriteLine( "VideoSources: unable to create VideoSources." + ex.ToString() ); }
}
return ( videoSources );
}
}
/// <summary>
/// Collection of available audio sources/physical connectors
/// on the current audio device.
/// </summary>
/// <remarks>
/// In most cases, if the device has only one source,
/// this collection will be empty. For audio
/// there are 2 different methods for enumerating audio sources
/// an audio crossbar (usually TV tuners?) or an audio mixer
/// (usually sound cards?). This class will first look for an
/// audio crossbar. If no sources or only one source is available
/// on the crossbar, this class will then look for an audio mixer.
/// This class does not support both methods.
///
/// <para>
/// The information contained in this property is retrieved and
/// cached the first time this property is accessed. Future
/// calls to this property use the cached results. This was done
/// for performance. </para>
///
/// <para>
/// However, this means <b>you may get different results depending
/// on when you access this property first</b>. If you are experiencing
/// problems, try accessing the property immediately after creating
/// the Capture class or immediately after setting the video and
/// audio compressors. Also, inform the developer. </para>
/// </remarks>
public SourceCollection AudioSources
{
get
{
if ( audioSources == null )
{
try
{
if ( audioDevice != null )
audioSources = new SourceCollection( captureGraphBuilder, audioDeviceFilter, false );
else
audioSources = new SourceCollection();
}
catch ( Exception ex ) { Debug.WriteLine( "AudioSources: unable to create AudioSources." + ex.ToString() ); }
}
return ( audioSources );
}
}
/// <summary>
/// Available property pages.
/// </summary>
/// <remarks>
/// These are property pages exposed by the DirectShow filters.
/// These property pages allow users modify settings on the
/// filters directly.
///
/// <para>
/// The information contained in this property is retrieved and
/// cached the first time this property is accessed. Future
/// calls to this property use the cached results. This was done
/// for performance. </para>
///
/// <para>
/// However, this means <b>you may get different results depending
/// on when you access this property first</b>. If you are experiencing
/// problems, try accessing the property immediately after creating
/// the Capture class or immediately after setting the video and
/// audio compressors. Also, inform the developer. </para>
/// </remarks>
public PropertyPageCollection PropertyPages
{
get
{
if ( propertyPages == null )
{
try
{
propertyPages = new PropertyPageCollection(
captureGraphBuilder,
videoDeviceFilter, audioDeviceFilter,
videoCompressorFilter, audioCompressorFilter,
VideoSources, AudioSources );
}
catch ( Exception ex ) { Debug.WriteLine( "PropertyPages: unable to get property pages." + ex.ToString() ); }
}
return( propertyPages );
}
}
/// <summary>
/// The TV Tuner or null if the current video device
/// does not have a TV Tuner.
/// </summary>
public Tuner Tuner { get { return( tuner ); } }
/// <summary>
/// Gets and sets the frame rate used to capture video.
/// </summary>
/// <remarks>
/// Common frame rates: 24 fps for film, 25 for PAL, 29.997
/// for NTSC. Not all NTSC capture cards can capture at
/// exactly 29.997 fps. Not all frame rates are supported.
/// When changing the frame rate, the closest supported
/// frame rate will be used.
///
/// <para>
/// Not all devices support getting/setting this property.
/// If this property is not supported, accessing it will
/// throw and exception. </para>
///
/// <para>
/// This property cannot be changed while capturing. Changing
/// this property while preview is enabled will cause some
/// fickering while the internal filter graph is partially
/// rebuilt. Changing this property while cued will cancel the
/// cue. Call Cue() again to re-cue the capture. </para>
/// </remarks>
public double FrameRate
{
get
{
long avgTimePerFrame = (long) getStreamConfigSetting( videoStreamConfig, "AvgTimePerFrame" );
return( (double) 10000000 / avgTimePerFrame );
}
set
{
long avgTimePerFrame = (long) ( 10000000 / value );
setStreamConfigSetting( videoStreamConfig, "AvgTimePerFrame", avgTimePerFrame );
}
}
/// <summary>
/// Gets and sets the frame size used to capture video.
/// </summary>
/// <remarks>
/// To change the frame size, assign a new Size object
/// to this property <code>capture.Size = new Size( w, h );</code>
/// rather than modifying the size in place
/// (capture.Size.Width = w;). Not all frame
/// rates are supported.
///
/// <para>
/// Not all devices support getting/setting this property.
/// If this property is not supported, accessing it will
/// throw and exception. </para>
///
/// <para>
/// This property cannot be changed while capturing. Changing
/// this property while preview is enabled will cause some
/// fickering while the internal filter graph is partially
/// rebuilt. Changing this property while cued will cancel the
/// cue. Call Cue() again to re-cue the capture. </para>
/// </remarks>
public Size FrameSize
{
get
{
BitmapInfoHeader bmiHeader;
bmiHeader = (BitmapInfoHeader) getStreamConfigSetting( videoStreamConfig, "BmiHeader" );
Size size = new Size( bmiHeader.Width, bmiHeader.Height );
return( size );
}
set
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -