执行以下步骤,使用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宝金博怎么下载多媒体
进口LMMpgDmxTLib
进口LMDVRSinkLib
进口LMMPEG2EncoderLib
使用Leadtools.188宝金博怎么下载Multimedia;
使用LMMpgDmxTLib;
使用LMDVRSinkLib;
使用LMMPEG2EncoderLib;
声明以下私有变量:
私人常量SLIDER_MAX作为整数= 10000
私人_targetFile作为字符串
私人_targetFolder作为字符串
私人_capturing作为布尔
私人_mpegDemux作为LMMpgDmxT
私人_dvrSink作为ILMDVRSink
私人_firstPTS作为双
私人_lastPTS作为双
私人常量intSlider_max = 10000;
私人字符串_targetFile;
私人字符串_targetFolder;
私人保龄球_capturing;
私人LMMpgDmxT _mpegDemux;
私人ILMDVRSink _dvrSink;
私人双_firstPTS;
私人双_lastPTS;
在Form1 Load事件中添加一个事件处理程序,代码如下:
私人子Form1_Load (按值传递发送方作为系统。对象,按值传递e作为System.EventArgs)处理MyBase.Load
如果_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。源
_capturectrl。预览=真正的
_capturectrl。PreviewSource = CapturePreview。视频
结束子
私人无效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 = Leadtools.Multimedia.Constants.MEDIATYPE_Stream)
结束函数
私人函数PTSToSliderPosition (按值传递curPTS作为双)作为整数
昏暗的retVal作为整数= 0
如果curPTS <= _firstPTS然后
retVal = 0
ElseIfcurPTS >= _lastPTS然后
retVal = SLIDER_MAX
其他的
retVal =CInt((curPTS - _firstPTS) * SLIDER_MAX) / (_lastPTS - _firstPTS) + 0.5)
结束如果
返回retVal
结束函数
私人函数SliderPositionToPTS (按值传递非营利组织作为整数)作为双
返回_firstPTS +CDbl(nPos) * (_lastPTS - _firstPTS) /CDbl(SLIDER_MAX)
结束函数
私人保龄球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 (按值传递发送方作为对象,按值传递e作为ProgressEventArgs)处理_capturectrl。进步
如果不_mpegDemux是没有什么然后
_mpegDemux.RefreshPosition (0)
昏暗的curPTS作为双= _mpegDemux。CurrentStreamPTS
_firstPTS = _mpegDemux。FirstStreamPTS
_lastPTS = _mpegDemux。LastStreamPTS
如果curPTS < _firstPTS需要说明_playctrl。状态=游戏状态。停顿了一下然后
_playctrl.Run ()
结束如果
结束如果
结束子
私人无效_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 (按值传递发送方作为系统。对象,按值传递e作为TrackingPositionChangedEventArgs)处理_playctrl。TrackingPositionChanged
如果不_mpegDemux是没有什么然后
_mpegDemux.RefreshPosition (0)
昏暗的curPTS作为双= _mpegDemux。CurrentStreamPTS
_firstPTS = _mpegDemux。FirstStreamPTS
_lastPTS = _mpegDemux。LastStreamPTS
_track。价值=PTSToSliderPosition (curPTS)
结束如果
结束子
私人无效_playctrl_TrackingPositionChanged (对象发件人,TrackingPositionChangedEventArgs e)
{
如果(_mpegDemux ! =零)
{
_mpegDemux.RefreshPosition (0);
双curPTS = _mpegDemux.CurrentStreamPTS;
_firstPTS = _mpegDemux.FirstStreamPTS;
_lastPTS = _mpegDemux.LastStreamPTS;
_track。价值=PTSToSliderPosition (curPTS);
}
}
向_track Scroll事件添加一个事件处理程序,并按如下代码编写:
私人子_track_Scroll (按值传递发送方作为系统。对象,按值传递e作为EventArgs)处理_track。滚动
如果不_mpegDemux是没有什么然后
昏暗的ptsPos作为双= SliderPositionToPTS (_track.Value)
_mpegDemux。CurrentStreamPTS = ptsPos
结束如果
结束子
私人无效_track_Scroll (对象发送者,EventArgs
{
如果(_mpegDemux ! =零)
{
双ptsPos = SliderPositionToPTS(_track.Value);
_mpegDemux。CurrentStreamPTS = ptsPos;
}
}
在_capturectrl Complete事件中添加一个事件处理程序,并按照如下代码编写它:
私人子_capturectrl_Complete (按值传递发送方作为系统。对象,按值传递e作为EventArgs)处理_capturectrl。完整的
对话框。显示(“捕获完整”)
_buttonCapture。启用了=真正的
结束子
私人无效_capturectrl_Complete (对象发送者,EventArgs
{
对话框。显示(“捕获完整”);
_buttonCapture。启用了=真正的;
}
在_playctrl StateChanged事件中添加一个事件处理程序,并按照如下代码编写它:
私人子_playctrl_StateChanged (按值传递发送方作为对象,按值传递e作为StateChangedEventArgs)处理_playctrl。statechange
如果e.state = PlayState。运行然后
_mpegDemux =没有什么
_mpegDemux = TryCast(_playctrl.GetSubObject(PlayObject.Splitter), LMMpgDmxT)
结束如果
结束子
私人无效_playctrl_StateChanged (对象发送者:StateChangedEventArgs
{
如果(e.state == PlayState.Running)
{
_mpegDemux =零;
_mpegDemux = _playctrl.GetSubObject(PlayObject.Splitter)作为LMMpgDmxT;
}
}
向_buttonCapture Click事件添加一个事件处理程序,并按照如下代码编写它:
私人子_buttonCapture_Click (按值传递发送方作为系统。对象,按值传递e作为System.EventArgs)处理_buttonCapture。点击
试一试
如果_capturing =真正的然后
_capturectrl.StopCapture ()
其他的
昏暗的recVideoComp作为字符串=字符串空虚
昏暗的recAudioComp作为字符串=字符串空虚
如果IsStreaming ()然后
_capturectrl.TargetFormats.DVR。选择=真正的
_capturectrl。TargetFormat = TargetFormatType。DVR
_capturectrl.VideoCompressors。选择= -1
_capturectrl.AudioCompressors。选择= -1
其他的
_capturectrl.TargetFormats.DVRTransport。选择=真正的
recVideoComp = _capturectrl.TargetFormats.DVRTransport.RecommendedVideoCompressor
recAudioComp = _capturectrl.TargetFormats.DVRTransport.RecommendedAudioCompressor
_capturectrl。TargetFormat = TargetFormatType。DVRTransport
如果recVideoComp < >字符串空虚然后
_capturectrl.VideoCompressors (recVideoComp)。选择=真正的
结束如果
如果recAudioComp < >字符串空虚然后
_capturectrl.AudioCompressors (recAudioComp)。选择=真正的
结束如果
如果_capturectrl.VideoCompressors.Mpeg2。选择=真正的然后
昏暗的mpeg2Encoder作为LMMPEG2Encoder = TryCast(_capturerectrl . getsubobject (CaptureObject.VideoCompressor), LMMPEG2Encoder)
如果不mpeg2Encoder是没有什么然后
mpeg2Encoder。EncodingThreads = eMpeg2EncodingThreads。MPEG2_THREAD_AUTO
mpeg2Encoder。视频Format = eMPEG2VIDEOFORMAT.MPEG2_VF_NTSC
Marshal.ReleaseComObject (mpeg2Encoder)
结束如果
结束如果
结束如果
_capturectrl。预览=真正的
_capturectrl。TargetFile = _targetFile
_capturectrl.ReadyCapture (CaptureMode.VideoAndAudio或CaptureMode.InhibitRun)
_dvrSink = TryCast(_capturerectrl . getsubobject (CaptureObject.Sink), ILMDVRSink)
如果不_dvrSink是没有什么然后
昏暗的dBuffSize作为双= 102400000100mb
昏暗的lFileCount作为整数= 8' 8缓冲文件
_dvrSink.StartChangingAttributes ()
_dvrSink。FolderCount = 1
_dvrSink.FolderName(0) = _targetFolder
_dvrSink。SetBufferSize(0, lFileCount, dBuffSize)
_dvrSink。StopChangingAttributes (假)
昏暗的bufferFolder作为字符串= _dvrSink。BaseName
结束如果
_capturectrl.RunCapture ()
_buttonCapture。启用了=假
_capturing =真正的
结束如果
抓前女友作为异常
MessageBox.Show (ex.Message)
结束试一试
结束子
私人无效_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.VideoAndAudio|CaptureMode.InhibitRun);
_dvrSink = _capturetrl . getsubobject (CaptureObject.Sink)作为ILMDVRSink;
如果(_dvrSink ! =零)
{
双dBuffSize = 102400000;// 100 MB
intlFileCount = 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 (按值传递发送方作为系统。对象,按值传递e作为System.EventArgs)处理_buttonPlay。点击
试一试
_mpegDemux =没有什么
_playCtrl.ResetSource ()
_playCtrl。PreferredMPEG2Splitter = Leadtools.188宝金博怎么下载Multimedia.Constants.Filter_MPEG2_Transport_Demux
_playctrl。源File = Path.Combine(_targetFolder, _targetFile)
_playctrl。运行
抓前女友作为异常
MessageBox.Show (ex.Message)
结束试一试
结束子
私人无效_buttonPlay_Click (对象发送者,系统。EventArgs e)
{
试一试
{
_mpegDemux =零;
_playCtrl.ResetSource ();
_playCtrl。PreferredMPEG2Splitter = Constants.Filter_MPEG2_Transport_Demux;
_playctrl。源File = Path.Combine(_targetFolder, _targetFile);
_playctrl.Run ();
}
抓(异常交货)
{
对话框。显示(这, ex.Message);
}
}
构建并运行程序以测试它。