使用LEADTOOLS DVR组件创建DirectShow播放器应用程序

执行以下步骤,使用LEADTOOLS multimedia ConvertCtrl和PlayCt188宝金博怎么下载rl控件以及LEADTOOLS MPEG-2传输模块的DVR组件创建并运行一个多媒体播放器DVR应用程序。

  1. 启动Visual Studio。

  2. 选择文件- >->项目……菜单上的。

  3. 新项目对话框,选择其中之一Visual c#项目或者。VB项目”,然后选择“Windows窗体应用程序的模板列表。

  4. 键入项目名称为“188宝金博怎么下载多媒体播放器DVR“在项目名称场,然后选择好吧.方法为项目键入一个新位置,或选择一个目录浏览按钮,然后单击好吧

  5. 要添加对Leadtools.Multimedia.dll的引用,右键单击188宝金博怎么下载参考文献的文件夹解决方案资源管理器窗口。选择“添加引用…从上下文菜单。在“添加引用对话框,选择“net选项卡,然后选择Leadtools.188宝金博怎么下载Multimedia.dll并点击好吧

  6. 接下来,向LEADTOOLS COM对象添加引用。右键单击参考文献“文件夹,并选择”添加引用…从上下文菜单。在“添加引用对话框,选择“COM选项卡,选择以下内容:

    • LEAD MPEG-2传输多路复用器库
    • LEAD MPEG2传输解复用程序库
    • 铅DVR水槽库

    注意:以上COM对象必须注册;万一他们不是;用regsvr32。有关更多信息,请参见DirectShow无注册激活.下一个点击好吧添加引用。

  7. 确保Form1在设计视图中。转到工具箱(视图->工具箱),然后拖动ConvertCtrl控制和PlayCtrl控件。注意:如果你没有ConvertCtrlPlayCtrl控件,选择工具->选择工具箱项目菜单上的。点击浏览然后选择Leadtools.188宝金博怎么下载Multimedia.dll从“< LEADTOOLS_INSTALLDIR > \ Bin \ Dotnet4 \ Win32然后点击开放然后点击好吧.将这些控件添加到表单后,设置以下属性:

    财产 价值
    的名字 _convertctrl
    上,左
    背景色 黑色的
    的名字 _playctrl
    上,下,左,右
    自动启动
  8. 转到工具箱(视图->工具箱)并在窗体上(convert控件的下方)拖动一个Text控件,并设置以下属性:

    财产 价值
    的名字 _txtSrcFile
    下,从左
    锁着的 真正的
  9. 转到工具箱(视图->工具箱),并将Button控件拖到文本控件的右侧,并设置以下属性:

    财产 价值
    的名字 _buttonBrowse
    文本 ...
    下,从左
  10. 转到工具箱(视图->工具箱)并在窗体上(play控件的下方)拖动TrackBar控件,并设置以下属性:

    财产 价值
    的名字 _track
    下,左,右
    最大 10000
  11. 转到工具箱(视图->工具箱),并拖动六个按钮控件到窗体底部(第一个在转换控件下面,其他在播放控件下面),并设置以下属性:

    财产 价值
    的名字 _buttonStartStop
    文本 开始
    下,从左
    财产 价值
    的名字 _buttonStop
    文本 停止
    下,右
    财产 价值
    的名字 _buttonPlayMPEG2StreamWithDVRBuffer
    文本 使用DVR缓冲区播放MPEG2流
    下,右
    财产 价值
    的名字 _buttonPlayDVRBufferFile
    文本 播放DVR缓冲文件
    下,右
    财产 价值
    的名字 _buttonSetDVRBufferLocations
    文本 设置DVR缓冲区位置
    下,右
    财产 价值
    的名字 _buttonCopyBufferedDVRData
    文本 复制缓冲DVR数据
    下,右
  12. 开关Form1编码视图(右键单击Form1在“解决方案资源管理器”中选择视图代码),并在文件的开头添加以下行:

    VB
    进口Leadtools。188宝金博怎么下载多媒体进口System.Runtime.InteropServices进口LMMpg2MxTLib进口LMMpgDmxTLib进口LMDVRSinkLib
    c#
    使用Leadtools.188宝金博怎么下载Multimedia;使用System.Runtime.InteropServices;使用LMMpg2MxTLib;使用LMMpgDmxTLib;使用LMDVRSinkLib;

  13. 声明以下私有变量:

    VB
    私人常量SLIDER_MAX作为整数= 10000私人_streaming作为布尔私人_firstPTS作为私人_lastPTS作为
    c#
    私人常量intSlider_max = 10000;私人保龄球_streaming =私人_firstPTS;私人_lastPTS;

  14. 向_convertctrl Started事件添加一个事件处理程序,并添加以下代码:

    VB
    私人_convertCtrl_Started (按值传递发送方作为对象按值传递e作为EventArgs)处理_convertCtrl。开始_streaming =真正的_buttonBrowse。启用了=_buttonPlayMPEG2StreamWithDVRBuffer。启用了=真正的_buttonSetDVRBufferLocations。启用了=真正的_buttonCopyBufferedDVRData。启用了=真正的结束
    c#
    无效_convertCtrl_Started (对象发送器,EventArgs_streaming =真正的_buttonBrowse。启用了=_buttonPlayMPEG2StreamWithDVRBuffer。Enabled = True;_buttonSetDVRBufferLocations。Enabled = True;_buttonCopyBufferedDVRData。Enabled = True;

  15. 向_convertctrl Complete事件添加一个事件处理程序,并添加以下代码:

    VB
    私人_convertCtrl_Complete (按值传递发送方作为对象按值传递e作为EventArgs)处理_convertCtrl。完整的如果_streaming =真正的然后_convertCtrl.StartConvert ()其他的_buttonStartStop。文本=“开始”_buttonBrowse。启用了=真正的_buttonPlayMPEG2StreamWithDVRBuffer。启用了=_buttonSetDVRBufferLocations。启用了=_buttonCopyBufferedDVRData。启用了=结束如果结束
    c#
    无效_convertCtrl_Complete (对象发送器,EventArgs如果(_streaming = =真正的_convertCtrl.StartConvert ();其他的_buttonStartStop。文本=“开始”_buttonBrowse。启用了=真正的_buttonPlayMPEG2StreamWithDVRBuffer。Enabled = False;_buttonSetDVRBufferLocations。Enabled = False;_buttonCopyBufferedDVRData。Enabled = False;

  16. 向_playctrl TrackingPositionChanged事件添加一个事件处理程序,并添加以下代码:

    VB
    私人_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(多路分配器)结束如果结束
    c#
    无效_playctrl_TrackingPositionChanged (对象发送器,TrackingPositionChangedEventArgsLMMpgDmxT demux = _playctrl.GetSubObject(PlayObject.Splitter)作为LMMpgDmxT;如果(多路分配器! =demux.RefreshPosition (0);_firstPTS = demux.FirstStreamPTS;_lastPTS = demux.LastStreamPTS;_track。价值=PTSToSliderPosition (多路分配器。CurrentStreamPTS);Marshal.ReleaseComObject(多路分配器);

  17. 向_track Scroll事件添加一个事件处理程序,并添加以下代码:

    VB
    私人_track_Scroll (按值传递发送方作为对象按值传递e作为EventArgs)处理_track。滚动昏暗的多路分配器作为LMMpgDmxT = TryCast(_playctrl.GetSubObject(PlayObject.Splitter), LMMpgDmxT)如果多路分配器没有什么然后demux.RefreshPosition (0)多路分配器。CurrentStreamPTS = SliderPositionToPTS(_track.Value)Marshal.ReleaseComObject(多路分配器)结束如果结束
    c#
    私人无效_track_Scroll (对象发送器,EventArgsLMMpgDmxT demux = _playctrl.GetSubObject(PlayObject.Splitter)作为LMMpgDmxT;如果(多路分配器! =demux.RefreshPosition (0);多路分配器。CurrentStreamPTS = SliderPositionToPTS(_track.Value);Marshal.ReleaseComObject(多路分配器);

  18. 添加以下辅助方法供_track控件的scroll和_playctrl轨道定位处理函数使用:

    VB
    私人函数PTSToSliderPosition (按值传递curPTS作为作为整数昏暗的retVal作为整数= 0如果curPTS <= _firstPTS然后retVal = 0ElseIfcurPTS >= _lastPTS然后retVal = SLIDER_MAX其他的retVal =CInt(((curPTS - _firstPTS) * SLIDER_MAX) / (_lastPTS - _firstPTS) + 0.5)结束如果返回retVal结束函数私人函数SliderPositionToPTS (按值传递非营利组织作为整数作为返回_firstPTS +CDbl(nPos) * (_lastPTS - _firstPTS) /CDbl(SLIDER_MAX)结束函数
    c#
    私人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;

  19. 向_buttonBrowse Click事件添加一个事件处理程序,并添加以下代码:

    VB
    私人_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。文件名结束如果结束
    c#
    私人无效_btnBrowse_Click (对象发送器,EventArgsOpenFileDialog 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。文件名;

  20. 向_buttonStartStop Click事件添加一个事件处理程序,并添加以下代码:

    VB
    私人_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 = 10Marshal.ReleaseComObject (mux)结束如果试一试_convertCtrl.StartConvert ()_buttonStartStop。文本=“停止”_buttonBrowse。启用了=e1作为异常结束试一试结束如果其他的如果_streaming =真正的然后_convertCtrl.StopConvert ()_buttonStartStop。文本=“开始”_buttonBrowse。启用了=真正的结束如果结束如果结束
    c#
    私人无效_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。启用了=真正的

  21. 向_buttonStop Click事件添加一个事件处理程序,并将其编码如下:

    VB
    私人_buttonStop_Click (按值传递发送方作为对象按值传递e作为EventArgs)处理_buttonStop。点击如果_playctrl。State = PlayState。运行然后_playctrl。停止()结束如果结束
    c#
    私人无效_buttonStop_Click (对象发送器,EventArgs如果(_playctrl。State == PlayState.Running)_playctrl.Stop ();

  22. 添加一个事件处理程序到_buttonPlayMPEG2StreamWithDVRBuffer点击事件播放UDP MPEG2流与DVR缓冲,并添加以下代码:

    VB
    私人_buttonPlayMPEG2StreamWithDVRBuffer_Click (按值传递发送方作为对象按值传递e作为EventArgs)处理_buttonPlayMPEG2StreamWithDVRBuffer。点击试一试打开UDP流,但不要自动启动_playctrl。自动启动=_playctrl。源文件=“udp: / / 127.0.0.1:9005”昏暗的DVRSink作为LMDVRSinkLib。LMDVRSinkDVRSink =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个缓冲数据文件,每个文件的最大大小为100MBDVRSink。SetBufferSize(0,5,102400000)'现在提交更改后的设置DVRSink。停止ChangingAttributes(“顺着小溪跑_playctrl.Run ()前女友作为异常对话框。显示(ex.Message)结束试一试结束
    c#
    私人无效_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个缓冲区数据文件,每个文件的最大大小为100MBDVRSink。SetBufferSize(0,5,102400000);//现在提交更改后的设置DVRSink。停止ChangingAttributes();//运行流_playctrl.Run ();(异常交货)对话框。显示(, ex.Message);

  23. 点击事件播放DVR缓冲文件,并添加以下代码:

    VB
    私人_buttonPlayDVRBufferFile_Click (按值传递发送方作为对象按值传递e作为EventArgs)处理_buttonPlayDVRBufferFile。点击试一试在播放器上设置源文件_playctrl。源文件=“C: \ Temp \ DVR \捕获。LBL”运行播放器_playctrl.Run ()前女友作为异常对话框。显示(ex.Message)结束试一试结束
    c#
    私人无效_buttonPlayDVRBufferFile_Click (对象发送器,EventArgs试一试//在播放器上设置源文件_playctrl。源文件=“C: \ \ Temp \ \ DVR \ \捕获。LBL”//运行流_playctrl.Run ();(异常交货)对话框。显示(, ex.Message);

  24. 添加一个事件处理程序到_buttonSetDVRBufferLocations单击事件,在多个物理磁盘上设置DVR缓冲区位置,并编码如下:

    VB
    私人_buttonSetDVRBufferLocations_Click (按值传递发送方作为对象按值传递e作为EventArgs)处理_buttonSetDVRBufferLocations。点击试一试打开UDP流,但不要自动启动_playctrl。自动启动=_playctrl。源文件=“udp: / / 127.0.0.1:9005”昏暗的DVRSink作为LMDVRSinkLib。LMDVRSinkDVRSink =DirectCast(_playctrl.GetSubObject (PlayObject.SourceFilter)、LMDVRSinkLib.LMDVRSink)告诉水槽我们要开始改变设置了DVRSink.StartChangingAttributes ()设置两个缓冲位置DVRSink。FolderCount = 2'设置基本文件名DVRSink。: =“捕获。LBL”'设置缓冲文件夹1的位置DVRSink.FolderName (0) =“C: \ Temp \ DVR”'设置缓冲文件夹1有2个缓冲数据文件,每个文件的最大文件大小为16MBDVRSink。SetBufferSize(0,2,16 * 1024000)'设置缓冲区文件夹2的位置DVRSink.FolderName (1) =“D: \ Temp \ DVR”'设置缓冲文件夹2有4个缓冲数据文件,每个文件的最大大小为8MBDVRSink。SetBufferSize(1,4,8192000)“告诉sink应用这些更改DVRSink。停止ChangingAttributes(运行播放器_playctrl.Run ()前女友作为异常对话框。显示(ex.Message)结束试一试结束
    c#
    私人无效_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个缓冲数据文件,每个文件的最大文件大小为16MBDVRSink。SetBufferSize(0,2,16 * 1024000);//设置缓冲区文件夹2的位置DVRSink.set_FolderName (1,“D: \ \ Temp \ \ DVR”);//设置缓冲文件夹2有4个缓冲数据文件,每个文件的最大大小为8MBDVRSink。SetBufferSize(1,4,8192000);//告诉sink应用更改DVRSink。停止ChangingAttributes();//运行播放器_playctrl.Run ();(异常交货)对话框。显示(, ex.Message);

  25. 添加一个事件处理程序到_buttonCopyBufferedDVRData Click事件来播放DVR缓冲文件,并添加以下代码:

    VB
    私人_buttonCopyBufferedDVRData_Click (按值传递发送方作为对象按值传递e作为EventArgs)处理_buttonCopyBufferedDVRData。点击试一试昏暗的第一个作为昏暗的最后的作为昏暗的总计作为_playctrl。自动启动=_playctrl。源文件=“udp: / / 127.0.0.1:9005”昏暗的DVRSink作为LMDVRSinkLib。LMDVRSinkDVRSink =DirectCast(_playctrl.GetSubObject (PlayObject.SourceFilter)、LMDVRSinkLib.LMDVRSink)“获得可复制范围DVRSink。GetAvailabilityInfo(第一个,最后一个,总数)将数据复制到新文件中DVRSink。CopyBufferToFile (“C: \ Temp \ DVR \ Copied_Capture.mpg”,第一,最后)前女友作为异常对话框。显示(ex.Message)结束试一试结束
    c#
    私人无效_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);

  26. 构建并运行该程序以测试它。单击[…]浏览按钮定位转换/流输出的视频文件。然后单击开始按钮开始流媒体。单击使用DVR缓冲区播放MPEG2流按钮测试播放UDP MPEG2流与DVR缓冲。单击播放DVR缓冲器按钮测试播放DVR缓冲文件。单击设置DVR缓冲区位置按钮来测试在多个物理磁盘上设置DVR缓冲位置,并使用DVR缓冲播放UDP MPEG2流。单击复制缓冲DVR数据按钮测试复制缓冲的DVR数据到一个新文件。最后,拖动跟踪条控件以重新定位流播放。

LEADTOOLS多188宝金博怎么下载媒体
188金宝搏的网址客服|支持|联系我们|知识产权公告
©1991 - 2021领先技术公司版权所有