执行以下步骤,使用LEADTOOLS MPEG-2传输模块的LEADTOOLS multimed188宝金博怎么下载ia CaptureCtrl和PlayCtrl控件和DVR组件创建和运行多媒体捕获DVR应用程序。
启动Visual Studio。
选择文件- >新- >项目…菜单上的。
在新项目对话框中,选择Visual c#项目或者VB项目在项目类型列表中,并选择“Windows应用程序在模板列表中。
输入项目名称为“188宝金博怎么下载多媒体DVR“在项目名称字段,然后单击好吧.类型为项目键入新位置或选择目录(如果需要)浏览按钮,然后单击好吧.
在“解决方案资源管理器窗口,右键单击参考文献"文件夹并选择"添加引用…从上下文菜单。在“添加引用对话框中,选择net选项卡并选择Leadtools。188宝金博怎么下载多媒体并点击好吧.同时,右键单击参考文献"文件夹并选择"添加引用…从上下文菜单。在“添加引用对话框中,选择COM选项卡并选择:
注意:以上COM对象必须注册;万一他们不是;用regsvr32。有关更多信息,请参阅DirectShow无注册表激活.
下一个点击好吧.
确保Form1在设计视图中。去工具箱(视图->工具箱),并拖动CaptureCtrl控件和PlayCtrl控件。将其添加到表单后,在控件上设置以下属性:
| 财产 | 价值 |
|---|---|
| 的名字 | _capturectrl |
| 锚 | 上,下,左 |
| 的名字 | _playctrl |
| 锚 | 上,下,右 |
| 自动启动 | 假 |
转到工具箱(视图->工具箱),并拖动窗体上的TrackBar控件(在播放控件的下面),并设置以下属性:
| 财产 | 价值 |
|---|---|
| 的名字 | _track |
| 锚 | 下,左,右 |
转到工具箱(视图->工具箱),将两个Button控件拖到窗体底部,并设置以下属性:
| 财产 | 价值 |
|---|---|
| 的名字 | _buttonCapture |
| 文本 | 捕获 |
| 锚 | 下,右 |
| 的名字 | _buttonPlay |
| 文本 | 玩 |
| 锚 | 下,右 |
开关Form1编码视图(右键单击Form1在“解决方案资源管理器”中选择视图代码),并在文件开头添加以下行:
使用Leadtools.188宝金博怎么下载Multimedia;使用LMMpgDmxTLib;使用LMDVRSinkLib;使用LMMPEG2EncoderLib;
声明以下私有变量:
私人常量intSlider_max = 10000;私人字符串_targetFile;私人字符串_targetFolder;私人保龄球_capturing;私人LMMpgDmxT _mpegDemux;私人ILMDVRSink _dvrSink;私人双_firstPTS;私人双_lastPTS;
在Form1 Load事件中添加一个事件处理程序,代码如下:
私人无效Form1_Load (对象发送者,系统。EventArgs e){如果(_capturectrl.VideoDevices。计数== 0)扔新异常(“没有可用的捕获设备”);如果(_capturectrl。VideoDevices [“模拟”) = =零)扔新异常(“没有模拟电视捕捉设备可用”);_capturectrl。VideoDevices [“模拟”]。选择=真正的;_capturectrl。UseVideoDeviceAudio =真正的;_capturing =假;_targetFolder = Path.Combine(Directory.GetCurrentDirectory(),“DVRFolder”);如果(! Directory.Exists (_targetFolder))Directory.CreateDirectory (_targetFolder);_targetFile =“capture.lbl”;_capturectrl。PreviewTap = CapturePreviewTap.Source;_capturectrl。预览=真正的;_capturectrl。PreviewSource = CapturePreview.Video;}
添加如下helper方法:
私人保龄球IsStreaming (){返回(_capturectrl。视频捕获StreamType == Constants.MEDIATYPE_Stream);}私人intPTSToSliderPosition (双curPTS){intretVal = 0;如果(curPTS <= _firstPTS)retVal = 0;其他的如果(curPTS >= _lastPTS)retVal = SLIDER_MAX;其他的retVal = (int)((curPTS - _firstPTS) * SLIDER_MAX) / (_lastPTS - _firstPTS) + 0.5);返回retVal;}私人双SliderPositionToPTS (int非营利组织){返回_ (1)双nPos * (_lastPTS - _firstPTS) / (双) SLIDER_MAX;}
向_capturectrl Progress事件添加一个事件处理程序,并将其编码如下:
私人无效_capturectrl_Progress (对象发送者,progressevenargs e){如果(_mpegDemux ! =零){_mpegDemux.RefreshPosition (0);双curPTS = _mpegDemux.CurrentStreamPTS;_firstPTS = _mpegDemux.FirstStreamPTS;_lastPTS = _mpegDemux.LastStreamPTS;如果(curPTS < _firstPTS && _playctrl。状态== PlayState.Paused)_playctrl.Run ();}}
为_playctrl TrackingPositionChanged事件添加一个事件处理程序,并按如下代码编写:
私人无效_playctrl_TrackingPositionChanged (对象发件人,TrackingPositionChangedEventArgs e){如果(_mpegDemux ! =零){_mpegDemux.RefreshPosition (0);双curPTS = _mpegDemux.CurrentStreamPTS;_firstPTS = _mpegDemux.FirstStreamPTS;_lastPTS = _mpegDemux.LastStreamPTS;_track。价值= PTSToSliderPosition(curPTS);}}
向_track Scroll事件添加一个事件处理程序,并按如下代码编写:
私人无效_track_Scroll (对象发送者,EventArgs{如果(_mpegDemux ! =零){双ptsPos = SliderPositionToPTS(_track.Value);_mpegDemux。CurrentStreamPTS = ptsPos;}}
在_capturectrl Complete事件中添加一个事件处理程序,并按照如下代码编写它:
私人无效_capturectrl_Complete (对象发送者,EventArgs{对话框。显示(“捕获完整”);_buttonCapture。启用了=真正的;}
在_playctrl StateChanged事件中添加一个事件处理程序,并按照如下代码编写它:
私人无效_playctrl_StateChanged (对象发送者:StateChangedEventArgs{如果(e.state == PlayState.Running){_mpegDemux =零;_mpegDemux = _playctrl.GetSubObject(PlayObject.Splitter)作为LMMpgDmxT;}}
向_buttonCapture Click事件添加一个事件处理程序,并按照如下代码编写它:
私人无效_buttonCapture_Click (对象发送者,系统。EventArgs e){试一试{如果(_capturing = =真正的)_capturectrl.StopCapture ();其他的{字符串recVideoComp =字符串空虚;字符串recAudioComp =字符串空虚;如果(IsStreaming ()){_capturectrl.TargetFormats.DVR。选择=真正的;_capturectrl。TargetFormat = targetformatttype . dvr;_capturectrl.VideoCompressors。选择= -1;_capturectrl.AudioCompressors。选择= -1;}其他的{_capturectrl.TargetFormats.DVRTransport。选择=真正的;recVideoComp = _capturectrl.TargetFormats.DVRTransport.RecommendedVideoCompressor;recAudioComp = _capturectrl.TargetFormats.DVRTransport.RecommendedAudioCompressor;_capturectrl。TargetFormat = targetformatttype . dvrtransport;如果(recVideoComp ! =字符串空虚)_capturectrl.VideoCompressors [recVideoComp]。选择=真正的;如果(recAudioComp ! =字符串空虚)_capturectrl.AudioCompressors [recAudioComp]。选择=真正的;如果(_capturectrl.VideoCompressors.Mpeg2。选择= =真正的){mpeg2Encoder = _capturetrl . getsubobject (CaptureObject.VideoCompressor)作为LMMPEG2Encoder;如果(mpeg2Encoder ! =零){mpeg2Encoder。EncodingThreads = eMpeg2EncodingThreads.MPEG2_THREAD_AUTO;mpeg2Encoder。视频Format = eMPEG2VIDEOFORMAT.MPEG2_VF_NTSC;Marshal.ReleaseComObject (mpeg2Encoder);}}}_capturectrl。预览=真正的;_capturectrl。目标文件= _targetFile;_capturectrl.ReadyCapture (CaptureMode。视频AndAudio | CaptureMode.InhibitRun);_dvrSink = _capturetrl . getsubobject (CaptureObject.Sink)作为ILMDVRSink;如果(_dvrSink ! =零){双dBuffSize = 102400000;// 100 MBintlFileCount = 8;// 8个缓冲文件_dvrSink.StartChangingAttributes ();_dvrSink。FolderCount = 1;_dvrSink。set_FolderName (0, _targetFolder);_dvrSink。SetBufferSize(0, lFileCount, dBuffSize);_dvrSink。StopChangingAttributes (假);字符串bufferFolder = _dvrSink.BaseName;}_capturectrl.RunCapture ();_buttonCapture。启用了=假;_capturing =真正的;}}抓(异常交货){对话框。显示(这, ex.Message);}}
为_buttonPlay Click事件添加一个事件处理程序,并按如下代码编写:
私人无效_buttonPlay_Click (对象发送者,系统。EventArgs e){试一试{_mpegDemux =零;_playCtrl.ResetSource ();_playCtrl。PreferredMPEG2Splitter = Constants.Filter_MPEG2_Transport_Demux;_playctrl。源File = Path.Combine(_targetFolder, _targetFile);_playctrl.Run ();}抓(异常交货){对话框。显示(这, ex.Message);}}
构建并运行程序以测试它。