执行以下步骤,使用LEADTOOLS multimedia ConvertCtrl和PlayCt188宝金博怎么下载rl控件以及LEADTOOLS MPEG-2传输模块的DVR组件创建并运行一个多媒体播放器DVR应用程序。
启动Visual Studio。
选择文件- >新->项目……菜单上的。
在新项目对话框,选择其中之一Visual c#项目或者。VB项目”,然后选择“Windows窗体应用程序的模板列表。
键入项目名称为“188宝金博怎么下载多媒体播放器DVR“在项目名称场,然后选择好吧.方法为项目键入一个新位置,或选择一个目录浏览按钮,然后单击好吧.
要添加对Leadtools.Multimedia.dll的引用,右键单击188宝金博怎么下载参考文献的文件夹解决方案资源管理器窗口。选择“添加引用…从上下文菜单。在“添加引用对话框,选择“net选项卡,然后选择Leadtools.188宝金博怎么下载Multimedia.dll并点击好吧.
接下来,向LEADTOOLS COM对象添加引用。右键单击参考文献“文件夹,并选择”添加引用…从上下文菜单。在“添加引用对话框,选择“COM选项卡,选择以下内容:
注意:以上COM对象必须注册;万一他们不是;用regsvr32。有关更多信息,请参见DirectShow无注册激活.下一个点击好吧添加引用。
确保Form1在设计视图中。转到工具箱(视图->工具箱),然后拖动ConvertCtrl控制和PlayCtrl控件。注意:如果你没有ConvertCtrl或PlayCtrl控件,选择工具->选择工具箱项目菜单上的。点击浏览然后选择Leadtools.188宝金博怎么下载Multimedia.dll从“< LEADTOOLS_INSTALLDIR > \ Bin \ Dotnet4 \ Win32然后点击开放然后点击好吧.将这些控件添加到表单后,设置以下属性:
财产 | 价值 |
---|---|
的名字 | _convertctrl |
锚 | 上,左 |
背景色 | 黑色的 |
的名字 | _playctrl |
锚 | 上,下,左,右 |
自动启动 | 假 |
转到工具箱(视图->工具箱)并在窗体上(convert控件的下方)拖动一个Text控件,并设置以下属性:
财产 | 价值 |
---|---|
的名字 | _txtSrcFile |
锚 | 下,从左 |
锁着的 | 真正的 |
转到工具箱(视图->工具箱),并将Button控件拖到文本控件的右侧,并设置以下属性:
财产 | 价值 |
---|---|
的名字 | _buttonBrowse |
文本 | ... |
锚 | 下,从左 |
转到工具箱(视图->工具箱)并在窗体上(play控件的下方)拖动TrackBar控件,并设置以下属性:
财产 | 价值 |
---|---|
的名字 | _track |
锚 | 下,左,右 |
最大 | 10000 |
转到工具箱(视图->工具箱),并拖动六个按钮控件到窗体底部(第一个在转换控件下面,其他在播放控件下面),并设置以下属性:
财产 | 价值 |
---|---|
的名字 | _buttonStartStop |
文本 | 开始 |
锚 | 下,从左 |
财产 | 价值 |
---|---|
的名字 | _buttonStop |
文本 | 停止 |
锚 | 下,右 |
财产 | 价值 |
---|---|
的名字 | _buttonPlayMPEG2StreamWithDVRBuffer |
文本 | 使用DVR缓冲区播放MPEG2流 |
锚 | 下,右 |
财产 | 价值 |
---|---|
的名字 | _buttonPlayDVRBufferFile |
文本 | 播放DVR缓冲文件 |
锚 | 下,右 |
财产 | 价值 |
---|---|
的名字 | _buttonSetDVRBufferLocations |
文本 | 设置DVR缓冲区位置 |
锚 | 下,右 |
财产 | 价值 |
---|---|
的名字 | _buttonCopyBufferedDVRData |
文本 | 复制缓冲DVR数据 |
锚 | 下,右 |
开关Form1编码视图(右键单击Form1在“解决方案资源管理器”中选择视图代码),并在文件的开头添加以下行:
进口Leadtools。188宝金博怎么下载多媒体
进口System.Runtime.InteropServices
进口LMMpg2MxTLib
进口LMMpgDmxTLib
进口LMDVRSinkLib
使用Leadtools.188宝金博怎么下载Multimedia;
使用System.Runtime.InteropServices;
使用LMMpg2MxTLib;
使用LMMpgDmxTLib;
使用LMDVRSinkLib;
声明以下私有变量:
私人常量SLIDER_MAX作为整数= 10000
私人_streaming作为布尔=假
私人_firstPTS作为双
私人_lastPTS作为双
私人常量intSlider_max = 10000;
私人保龄球_streaming =假;
私人双_firstPTS;
私人双_lastPTS;
向_convertctrl Started事件添加一个事件处理程序,并添加以下代码:
私人子_convertCtrl_Started (按值传递发送方作为对象,按值传递e作为EventArgs)处理_convertCtrl。开始
_streaming =真正的
_buttonBrowse。启用了=假
_buttonPlayMPEG2StreamWithDVRBuffer。启用了=真正的
_buttonSetDVRBufferLocations。启用了=真正的
_buttonCopyBufferedDVRData。启用了=真正的
结束子
无效_convertCtrl_Started (对象发送器,EventArgs
{
_streaming =真正的;
_buttonBrowse。启用了=假;
_buttonPlayMPEG2StreamWithDVRBuffer。Enabled = True;
_buttonSetDVRBufferLocations。Enabled = True;
_buttonCopyBufferedDVRData。Enabled = True;
}
向_convertctrl Complete事件添加一个事件处理程序,并添加以下代码:
私人子_convertCtrl_Complete (按值传递发送方作为对象,按值传递e作为EventArgs)处理_convertCtrl。完整的
如果_streaming =真正的然后
_convertCtrl.StartConvert ()
其他的
_buttonStartStop。文本=“开始”
_buttonBrowse。启用了=真正的
_buttonPlayMPEG2StreamWithDVRBuffer。启用了=假
_buttonSetDVRBufferLocations。启用了=假
_buttonCopyBufferedDVRData。启用了=假
结束如果
结束子
无效_convertCtrl_Complete (对象发送器,EventArgs
{
如果(_streaming = =真正的)
_convertCtrl.StartConvert ();
其他的
{
_buttonStartStop。文本=“开始”;
_buttonBrowse。启用了=真正的;
_buttonPlayMPEG2StreamWithDVRBuffer。Enabled = False;
_buttonSetDVRBufferLocations。Enabled = False;
_buttonCopyBufferedDVRData。Enabled = False;
}
}
向_playctrl TrackingPositionChanged事件添加一个事件处理程序,并添加以下代码:
私人子_playctrl_TrackingPositionChanged (按值传递发送方作为对象,按值传递e作为TrackingPositionChangedEventArgs)处理_playctrl。TrackingPositionChanged
昏暗的多路分配器作为LMMpgDmxT = TryCast(_playctrl.GetSubObject(PlayObject.Splitter), LMMpgDmxT)
如果不多路分配器是没有什么然后
demux.RefreshPosition (0)
_firstPTS = demux。FirstStreamPTS
_lastPTS = demux。LastStreamPTS
_track。价值=PTSToSliderPosition (多路分配器。CurrentStreamPTS)
Marshal.ReleaseComObject(多路分配器)
结束如果
结束子
无效_playctrl_TrackingPositionChanged (对象发送器,TrackingPositionChangedEventArgs
{
LMMpgDmxT demux = _playctrl.GetSubObject(PlayObject.Splitter)作为LMMpgDmxT;
如果(多路分配器! =零)
{
demux.RefreshPosition (0);
_firstPTS = demux.FirstStreamPTS;
_lastPTS = demux.LastStreamPTS;
_track。价值=PTSToSliderPosition (多路分配器。CurrentStreamPTS);
Marshal.ReleaseComObject(多路分配器);
}
}
向_track Scroll事件添加一个事件处理程序,并添加以下代码:
私人子_track_Scroll (按值传递发送方作为对象,按值传递e作为EventArgs)处理_track。滚动
昏暗的多路分配器作为LMMpgDmxT = TryCast(_playctrl.GetSubObject(PlayObject.Splitter), LMMpgDmxT)
如果不多路分配器是没有什么然后
demux.RefreshPosition (0)
多路分配器。CurrentStreamPTS = SliderPositionToPTS(_track.Value)
Marshal.ReleaseComObject(多路分配器)
结束如果
结束子
私人无效_track_Scroll (对象发送器,EventArgs
{
LMMpgDmxT demux = _playctrl.GetSubObject(PlayObject.Splitter)作为LMMpgDmxT;
如果(多路分配器! =零)
{
demux.RefreshPosition (0);
多路分配器。CurrentStreamPTS = SliderPositionToPTS(_track.Value);
Marshal.ReleaseComObject(多路分配器);
}
}
添加以下辅助方法供_track控件的scroll和_playctrl轨道定位处理函数使用:
私人函数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)
结束函数
私人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非营利组织)
{
返回_firstPTS + (双)nPos * (_lastPTS - _firstPTS) / (双) SLIDER_MAX;
}
向_buttonBrowse Click事件添加一个事件处理程序,并添加以下代码:
私人子_btnBrowse_Click (按值传递发送方作为对象,按值传递e作为EventArgs)处理_buttonBrowse。点击
昏暗的探讨作为OpenFileDialog =新OpenFileDialog ()
探讨。文件名= _txtSrcFile。文本
探讨。FilterIndex = 0
如果_txtSrcFile。文本< >字符串空虚然后
探讨。InitialDirectory = Path.GetDirectoryName(_txtSrcFile.Text)
其他的
探讨。InitialDirectory = Directory.GetCurrentDirectory()
结束如果
探讨。多选=假
探讨。Title =“选择源视频”
探讨。CheckFileExists =真正的
探讨。过滤器=MPEG2视频文件(*.mpg)|*。mpg |所有文件(*.*)|*.*"
如果ofn.ShowDialog() = dialgresult。好吧然后
_txtSrcFile。文本= ofn。文件名
结束如果
结束子
私人无效_btnBrowse_Click (对象发送器,EventArgs
{
OpenFileDialog ofn =新OpenFileDialog ();
探讨。文件名= _txtSrcFile.Text;
探讨。FilterIndex = 0;
如果(_txtSrcFile。文本! =字符串空虚)
探讨。InitialDirectory = Path.GetDirectoryName(_txtSrcFile.Text);
其他的
探讨。InitialDirectory = Directory.GetCurrentDirectory();
探讨。多选=假;
探讨。Title =“选择源视频”;
探讨。CheckFileExists =真正的;
探讨。过滤器=MPEG2视频文件(*.mpg)|*。mpg |所有文件(*.*)|*.*";
如果(ofn.ShowDialog() == dialgresult . ok)
{
_txtSrcFile。文本= ofn。文件名;
}
}
向_buttonStartStop Click事件添加一个事件处理程序,并添加以下代码:
私人子_btnStartStop_Click (按值传递发送方作为对象,按值传递e作为EventArgs)处理_buttonStartStop。点击
昏暗的srcFile作为字符串= _txtSrcFile。文本
如果_streaming =假然后
如果srcFile < >字符串空虚需要说明File.Exists (srcFile)然后
_convertCtrl。源文件=srcFile
_convertCtrl。AllowedStreams = StreamFormatType。AudioVideoCC
_convertCtrl。PreferredMPEG2Splitter = Leadtools.188宝金博怎么下载Multimedia.Constants.Filter_MPEG2_Transport_Demux
_convertCtrl。TargetFormat = TargetFormatType。MPEG2Transport
_convertCtrl。预览=真正的
_convertCtrl。TargetFile =“udp: / / 127.0.0.1:9005”
昏暗的mux作为LMMpg2MxT = TryCast(_convertCtrl.GetSubObject(ConvertObject.TargetFilter), LMMpg2MxT)
如果不mux是没有什么然后
mux。OutputType =CInt(LMMpg2MxTLib.Mpg2MxT_OutputType.Mpg2MxT_OutputType_Broadcast)
mux。ResyncInterval = 10
Marshal.ReleaseComObject (mux)
结束如果
试一试
_convertCtrl.StartConvert ()
_buttonStartStop。文本=“停止”
_buttonBrowse。启用了=假
抓e1作为异常
结束试一试
结束如果
其他的
如果_streaming =真正的然后
_convertCtrl.StopConvert ()
_buttonStartStop。文本=“开始”
_buttonBrowse。启用了=真正的
结束如果
结束如果
结束子
私人无效_btnStartStop_Click (对象发送器,EventArgs
{
字符串srcFile = _txtSrcFile.Text;
如果(_streaming = =假)
{
如果(srcFile ! =字符串.Empty && File.Exists(srcFile))
{
_convertCtrl。源文件=srcFile;
_convertCtrl。AllowedStreams = streamformtype . audiovideocc;
_convertCtrl。PreferredMPEG2Splitter = Constants.Filter_MPEG2_Transport_Demux;
_convertCtrl。TargetFormat = targetformtype . mpeg2transport;
_convertCtrl。预览=真正的;
_convertCtrl。TargetFile =@“udp: / / 127.0.0.1:9005”;
LMMpg2MxT mux = _convertCtrl.GetSubObject(ConvertObject.TargetFilter)作为LMMpg2MxT;
如果(mux ! =零)
{
mux。OutputType = (int) LMMpg2MxTLib.Mpg2MxT_OutputType.Mpg2MxT_OutputType_Broadcast;
mux。ResyncInterval = 10;
Marshal.ReleaseComObject (mux);
}
试一试
{
_convertCtrl.StartConvert ();
_buttonStartStop。文本=“停止”;
_buttonBrowse。启用了=假;
}
抓(异常){}
}
}
其他的
{
如果(_streaming = =真正的)
{
_convertCtrl.StopConvert ();
_buttonStartStop。文本=“开始”;
_buttonBrowse。启用了=真正的;
}
}
}
向_buttonStop Click事件添加一个事件处理程序,并将其编码如下:
私人子_buttonStop_Click (按值传递发送方作为对象,按值传递e作为EventArgs)处理_buttonStop。点击
如果_playctrl。State = PlayState。运行然后
_playctrl。停止()
结束如果
结束子
私人无效_buttonStop_Click (对象发送器,EventArgs
{
如果(_playctrl。State == PlayState.Running)
{
_playctrl.Stop ();
}
}
添加一个事件处理程序到_buttonPlayMPEG2StreamWithDVRBuffer点击事件播放UDP MPEG2流与DVR缓冲,并添加以下代码:
私人子_buttonPlayMPEG2StreamWithDVRBuffer_Click (按值传递发送方作为对象,按值传递e作为EventArgs)处理_buttonPlayMPEG2StreamWithDVRBuffer。点击
试一试
打开UDP流,但不要自动启动
_playctrl。自动启动=假
_playctrl。源文件=“udp: / / 127.0.0.1:9005”
昏暗的DVRSink作为LMDVRSinkLib。LMDVRSink
DVRSink =DirectCast(_playctrl.GetSubObject (PlayObject.SourceFilter)、LMDVRSinkLib.LMDVRSink)
“告诉DVR接收器设置即将改变
DVRSink.StartChangingAttributes ()
只设置一个DVR缓冲文件夹
DVRSink。FolderCount = 1
’将缓冲区基文件名设置为‘Capture’。LBL的
DVRSink。: =“捕获。LBL”
'设置缓冲区文件夹位置为'C:\Temp\DVR'
DVRSink.FolderName(0) = (“C: \ Temp \ DVR”)
'设置缓冲文件夹有5个缓冲数据文件,每个文件的最大大小为100MB
DVRSink。SetBufferSize(0,5,102400000)
'现在提交更改后的设置
DVRSink。停止ChangingAttributes(假)
“顺着小溪跑
_playctrl.Run ()
抓前女友作为异常
对话框。显示(我ex.Message)
结束试一试
结束子
私人无效_buttonPlayMPEG2StreamWithDVRBuffer_Click (对象发送器,EventArgs
{
试一试
{
//打开UDP流,但不自动启动
_playctrl。自动启动=假;
_playctrl。源文件=“udp: / / 127.0.0.1:9005”;
LMDVRSinkLib。LMDVRSinkDVRSink;
DVRSink = (LMDVRSinkLib.LMDVRSink)(_playcontrol . getsubobject (PlayObject.SourceFilter));
//告诉DVR接收器设置即将更改
DVRSink.StartChangingAttributes ();
//只设置一个DVR缓冲文件夹
DVRSink。FolderCount = 1;
//设置缓冲区基文件名为Capture。LBL的
DVRSink。: =“捕获。LBL”;
//设置缓冲区文件夹的位置为'C:\Temp\DVR'
DVRSink.set_FolderName (0,“C: \ \ Temp \ \ DVR”);
//设置缓冲区文件夹有5个缓冲区数据文件,每个文件的最大大小为100MB
DVRSink。SetBufferSize(0,5,102400000);
//现在提交更改后的设置
DVRSink。停止ChangingAttributes(假);
//运行流
_playctrl.Run ();
}
抓(异常交货)
{
对话框。显示(这, ex.Message);
}
}
点击事件播放DVR缓冲文件,并添加以下代码:
私人子_buttonPlayDVRBufferFile_Click (按值传递发送方作为对象,按值传递e作为EventArgs)处理_buttonPlayDVRBufferFile。点击
试一试
在播放器上设置源文件
_playctrl。源文件=“C: \ Temp \ DVR \捕获。LBL”
运行播放器
_playctrl.Run ()
抓前女友作为异常
对话框。显示(我ex.Message)
结束试一试
结束子
私人无效_buttonPlayDVRBufferFile_Click (对象发送器,EventArgs
{
试一试
{
//在播放器上设置源文件
_playctrl。源文件=“C: \ \ Temp \ \ DVR \ \捕获。LBL”;
//运行流
_playctrl.Run ();
}
抓(异常交货)
{
对话框。显示(这, ex.Message);
}
}
添加一个事件处理程序到_buttonSetDVRBufferLocations单击事件,在多个物理磁盘上设置DVR缓冲区位置,并编码如下:
私人子_buttonSetDVRBufferLocations_Click (按值传递发送方作为对象,按值传递e作为EventArgs)处理_buttonSetDVRBufferLocations。点击
试一试
打开UDP流,但不要自动启动
_playctrl。自动启动=假
_playctrl。源文件=“udp: / / 127.0.0.1:9005”
昏暗的DVRSink作为LMDVRSinkLib。LMDVRSink
DVRSink =DirectCast(_playctrl.GetSubObject (PlayObject.SourceFilter)、LMDVRSinkLib.LMDVRSink)
告诉水槽我们要开始改变设置了
DVRSink.StartChangingAttributes ()
设置两个缓冲位置
DVRSink。FolderCount = 2
'设置基本文件名
DVRSink。: =“捕获。LBL”
'设置缓冲文件夹1的位置
DVRSink.FolderName (0) =“C: \ Temp \ DVR”
'设置缓冲文件夹1有2个缓冲数据文件,每个文件的最大文件大小为16MB
DVRSink。SetBufferSize(0,2,16 * 1024000)
'设置缓冲区文件夹2的位置
DVRSink.FolderName (1) =“D: \ Temp \ DVR”
'设置缓冲文件夹2有4个缓冲数据文件,每个文件的最大大小为8MB
DVRSink。SetBufferSize(1,4,8192000)
“告诉sink应用这些更改
DVRSink。停止ChangingAttributes(假)
运行播放器
_playctrl.Run ()
抓前女友作为异常
对话框。显示(我ex.Message)
结束试一试
结束子
私人无效_buttonSetDVRBufferLocations_Click (对象发送器,EventArgs
{
试一试
{
//打开UDP流,但不自动启动
_playctrl。自动启动=假;
_playctrl。源文件=“udp: / / 127.0.0.1:9005”;
LMDVRSinkLib。LMDVRSinkDVRSink;
DVRSink = (LMDVRSinkLib.LMDVRSink)(_playcontrol . getsubobject (PlayObject.SourceFilter));
//告诉sink我们开始更改设置
DVRSink.StartChangingAttributes ();
//设置两个缓冲区位置
DVRSink。FolderCount = 2;
//设置基文件名
DVRSink。: =“捕获。LBL”;
//设置缓冲区文件夹1的位置
DVRSink.set_FolderName (0,“C: \ \ Temp \ \ DVR”);
//设置缓冲文件夹1有2个缓冲数据文件,每个文件的最大文件大小为16MB
DVRSink。SetBufferSize(0,2,16 * 1024000);
//设置缓冲区文件夹2的位置
DVRSink.set_FolderName (1,“D: \ \ Temp \ \ DVR”);
//设置缓冲文件夹2有4个缓冲数据文件,每个文件的最大大小为8MB
DVRSink。SetBufferSize(1,4,8192000);
//告诉sink应用更改
DVRSink。停止ChangingAttributes(假);
//运行播放器
_playctrl.Run ();
}
抓(异常交货)
{
对话框。显示(这, ex.Message);
}
}
添加一个事件处理程序到_buttonCopyBufferedDVRData Click事件来播放DVR缓冲文件,并添加以下代码:
私人子_buttonCopyBufferedDVRData_Click (按值传递发送方作为对象,按值传递e作为EventArgs)处理_buttonCopyBufferedDVRData。点击
试一试
昏暗的第一个作为双
昏暗的最后的作为双
昏暗的总计作为双
_playctrl。自动启动=假
_playctrl。源文件=“udp: / / 127.0.0.1:9005”
昏暗的DVRSink作为LMDVRSinkLib。LMDVRSink
DVRSink =DirectCast(_playctrl.GetSubObject (PlayObject.SourceFilter)、LMDVRSinkLib.LMDVRSink)
“获得可复制范围
DVRSink。GetAvailabilityInfo(第一个,最后一个,总数)
将数据复制到新文件中
DVRSink。CopyBufferToFile (“C: \ Temp \ DVR \ Copied_Capture.mpg”,第一,最后)
抓前女友作为异常
对话框。显示(我ex.Message)
结束试一试
结束子
私人无效_buttonCopyBufferedDVRData_Click (对象发送器,EventArgs
{
试一试
{
双第一个;
双最后一次;
双总;
//打开UDP流,但不自动启动
_playctrl。自动启动=假;
_playctrl。源文件=“udp: / / 127.0.0.1:9005”;
LMDVRSinkLib。LMDVRSinkDVRSink;
DVRSink = (LMDVRSinkLib.LMDVRSink)(_playcontrol . getsubobject (PlayObject.SourceFilter));
//获取可复制的范围
DVRSink。GetAvailabilityInfo (出首先,出最后的出总);
//复制数据到新文件
DVRSink。CopyBufferToFile (“C: \ \ Temp \ \ DVR \ \ Copied_Capture.mpg”,第一,最后);
}
抓(异常交货)
{
对话框。显示(这, ex.Message);
}
}
构建并运行该程序以测试它。单击[…]浏览按钮定位转换/流输出的视频文件。然后单击开始按钮开始流媒体。单击使用DVR缓冲区播放MPEG2流按钮测试播放UDP MPEG2流与DVR缓冲。单击播放DVR缓冲器按钮测试播放DVR缓冲文件。单击设置DVR缓冲区位置按钮来测试在多个物理磁盘上设置DVR缓冲位置,并使用DVR缓冲播放UDP MPEG2流。单击复制缓冲DVR数据按钮测试复制缓冲的DVR数据到一个新文件。最后,拖动跟踪条控件以重新定位流播放。