Creating a LEADTOOLS Multimedia Capture Application using LEADTOOLS DVR Components

Perform the following steps to create and run a multimedia capture DVR application using the LEADTOOLS Multimedia CaptureCtrl and PlayCtrl controls and DVR components of the LEADTOOLS MPEG-2 Transport module.

  1. Start Visual Studio.

  2. Choose File->New->Project... from the menu.

  3. In the New Project dialog box, choose either "Visual C# Projects" or "VB Projects" in the Projects Type List, and choose "Windows Application " in the Templates List.

  4. Type the project name as "Multimedia DVR" in the Project Name field, and then click OK. If desired, type a new location for your project or select a directory using the Browse button, and then click OK.

  5. In the "Solution Explorer" window, right-click the "References" folder, and select "Add Reference..." from the context menu. In the "Add Reference" dialog box, select the ".NET" tab and select Leadtools.Multimedia and click OK. Also, right-click the "References" folder, and select "Add Reference..." from the context menu. In the "Add Reference" dialog box, select the "COM" tab and select:

    • LEAD MPEG2 Transport Demultiplexer Library
    • LEAD DVR Sink Library
    • LEAD MPEG-2 Encoder Filter Library

    Note: The above COM objects must be registered; in case they were not; using regsvr32. For more information, refer to DirectShow Registry-free Activation.

    Next click OK.

  6. Make sure Form1 is in design view. Go to the toolbox (View->Toolbox) and drag a CaptureCtrl control and a PlayCtrl control on the form. After adding it to the form, set the following properties on the controls:

    Property Value
    Name _capturectrl
    Anchor Top, Bottom, Left
    Name _playctrl
    Anchor Top, Bottom, Right
    AutoStart false
  7. Go to the toolbox (View->Toolbox) and drag a TrackBar control on the form (below the play control) and set the following properties:

    Property Value
    Name _track
    Anchor Bottom, Left, Right
  8. Go to the toolbox (View->Toolbox) and drag two Button controls to the bottom of the form and set the following properties:

    Property Value
    Name _buttonCapture
    Text Capture
    Anchor Bottom, Right
    Name _buttonPlay
    Text Play
    Anchor Bottom, Right
  9. Switch Form1 to code view (right-click Form1 in the Solution Explorer then choose View Code) and add the following lines to the beginning of the file:

    VB
    Imports Leadtools.Multimedia 
    Imports LMMpgDmxTLib 
    Imports LMDVRSinkLib 
    Imports LMMPEG2EncoderLib 
                      
         

    C#
    using Leadtools.Multimedia; 
    using LMMpgDmxTLib; 
    using LMDVRSinkLib; 
    using LMMPEG2EncoderLib; 
                      
         

  10. Declare the following private variables:

    VB
    Private Const SLIDER_MAX As Integer = 10000 
    Private _targetFile As String 
    Private _targetFolder As String 
    Private _capturing As Boolean 
    Private _mpegDemux As LMMpgDmxT 
    Private _dvrSink As ILMDVRSink 
    Private _firstPTS As Double 
    Private _lastPTS As Double 
                      
         

    C#
    private const int SLIDER_MAX = 10000; 
    private string _targetFile; 
    private string _targetFolder; 
    private bool _capturing; 
    private LMMpgDmxT _mpegDemux; 
    private ILMDVRSink _dvrSink; 
    private double _firstPTS; 
    private double _lastPTS; 
                      
         

  11. Add an event handler to the Form1 Load event and code it as follows:

    VB
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
      If _capturectrl.VideoDevices.Count = 0 Then 
         Throw New Exception("No capture devices available") 
      End If 
                      
      If _capturectrl.VideoDevices("Analog") Is Nothing Then 
         Throw New Exception("No Analog TV capture devices available") 
      End If 
                      
      _capturectrl.VideoDevices("Analog").Selected = True 
      _capturectrl.UseVideoDeviceAudio = True 
                      
      _capturing = False 
      _targetFolder = Path.Combine(Directory.GetCurrentDirectory(), "DVRFolder") 
      If (Not Directory.Exists(_targetFolder)) Then 
         Directory.CreateDirectory(_targetFolder) 
      End If 
                      
      _targetFile = "capture.lbl" 
                      
      _capturectrl.PreviewTap = CapturePreviewTap.Source 
      _capturectrl.Preview = True 
      _capturectrl.PreviewSource = CapturePreview.Video 
    End Sub 
                      
         

    C#
    private void Form1_Load(object sender, System.EventArgs e) 
    { 
       if (_capturectrl.VideoDevices.Count == 0) 
          throw new Exception("No capture devices available"); 
                     
       if (_capturectrl.VideoDevices["Analog"] == null) 
          throw new Exception("No Analog TV capture devices available"); 
                     
       _capturectrl.VideoDevices["Analog"].Selected = true; 
       _capturectrl.UseVideoDeviceAudio = true; 
                      
       _capturing = false; 
       _targetFolder = Path.Combine(Directory.GetCurrentDirectory(), "DVRFolder"); 
       if (!Directory.Exists(_targetFolder)) 
          Directory.CreateDirectory(_targetFolder); 
                      
       _targetFile = "capture.lbl"; 
                      
       _capturectrl.PreviewTap = CapturePreviewTap.Source; 
       _capturectrl.Preview = true; 
       _capturectrl.PreviewSource = CapturePreview.Video; 
    } 
                      
         

  12. Add the following helper methods as follows:

    VB
    Private Function IsStreaming() As Boolean 
       Return (_capturectrl.VideoCaptureStreamType = Leadtools.Multimedia.Constants.MEDIATYPE_Stream) 
    End Function 
                      
    Private Function PTSToSliderPosition(ByVal curPTS As Double) As Integer 
       Dim retVal As Integer = 0 
       If curPTS <= _firstPTS Then 
          retVal = 0 
       ElseIf curPTS >= _lastPTS Then 
          retVal = SLIDER_MAX 
       Else 
          retVal = CInt(((curPTS - _firstPTS) * SLIDER_MAX) / (_lastPTS - _firstPTS) + 0.5) 
       End If 
                      
       Return retVal 
    End Function 
                      
    Private Function SliderPositionToPTS(ByVal nPos As Integer) As Double 
       Return _firstPTS + CDbl(nPos) * (_lastPTS - _firstPTS) / CDbl(SLIDER_MAX) 
    End Function 
                      
         

    C#
    private bool IsStreaming() 
    { 
       return (_capturectrl.VideoCaptureStreamType == Constants.MEDIATYPE_Stream); 
    } 
                      
    private int PTSToSliderPosition(double curPTS) 
    { 
       int retVal = 0; 
       if (curPTS <= _firstPTS) 
          retVal = 0; 
       else if (curPTS >= _lastPTS) 
          retVal = SLIDER_MAX; 
       else 
          retVal = (int)(((curPTS - _firstPTS) * SLIDER_MAX) / (_lastPTS - _firstPTS) + 0.5); 
                      
       return retVal; 
    } 
                      
    private double SliderPositionToPTS(int nPos) 
    { 
       return _firstPTS + (double)nPos * (_lastPTS - _firstPTS) / (double)SLIDER_MAX; 
    } 
                      
         

  13. Add an event handler to the _capturectrl Progress event and code it as follows:

    VB
    Private Sub _capturectrl_Progress(ByVal sender As Object, ByVal e As ProgressEventArgs) Handles _capturectrl.Progress 
      If Not _mpegDemux Is Nothing Then 
         _mpegDemux.RefreshPosition(0) 
                      
         Dim curPTS As Double = _mpegDemux.CurrentStreamPTS 
         _firstPTS = _mpegDemux.FirstStreamPTS 
         _lastPTS = _mpegDemux.LastStreamPTS 
                      
         If curPTS < _firstPTS AndAlso _playctrl.State = PlayState.Paused Then 
            _playctrl.Run() 
         End If 
      End If 
    End Sub 
                      
         

    C#
    private void _capturectrl_Progress(object sender, ProgressEventArgs e) 
    { 
       if (_mpegDemux != null) 
       { 
          _mpegDemux.RefreshPosition(0); 
                      
          double curPTS = _mpegDemux.CurrentStreamPTS; 
          _firstPTS = _mpegDemux.FirstStreamPTS; 
          _lastPTS = _mpegDemux.LastStreamPTS; 
                      
          if (curPTS < _firstPTS && _playctrl.State == PlayState.Paused) 
             _playctrl.Run(); 
       } 
    } 
                      
         

  14. Add an event handler to the _playctrl TrackingPositionChanged event and code it as follows:

    VB
    Private Sub _playctrl_TrackingPositionChanged(ByVal sender As System.Object, ByVal e As TrackingPositionChangedEventArgs) Handles _playctrl.TrackingPositionChanged 
       If Not _mpegDemux Is Nothing Then 
          _mpegDemux.RefreshPosition(0) 
                     
          Dim curPTS As Double = _mpegDemux.CurrentStreamPTS 
          _firstPTS = _mpegDemux.FirstStreamPTS 
          _lastPTS = _mpegDemux.LastStreamPTS 
                     
          _track.Value = PTSToSliderPosition(curPTS) 
       End If 
    End Sub 
                      
         

    C#
    private void _playctrl_TrackingPositionChanged(object sender, TrackingPositionChangedEventArgs e) 
    { 
       if (_mpegDemux != null) 
       { 
          _mpegDemux.RefreshPosition(0); 
                     
          double curPTS = _mpegDemux.CurrentStreamPTS; 
          _firstPTS = _mpegDemux.FirstStreamPTS; 
          _lastPTS = _mpegDemux.LastStreamPTS; 
                     
          _track.Value = PTSToSliderPosition(curPTS); 
       } 
    } 
                      
         

  15. Add an event handler to the _track Scroll event and code it as follows:

    VB
    Private Sub _track_Scroll(ByVal sender As System.Object, ByVal e As EventArgs) Handles _track.Scroll 
       If Not _mpegDemux Is Nothing Then 
          Dim ptsPos As Double = SliderPositionToPTS(_track.Value) 
          _mpegDemux.CurrentStreamPTS = ptsPos 
       End If 
    End Sub 
                      
         

    C#
    private void _track_Scroll(object sender, EventArgs e) 
    { 
       if (_mpegDemux != null) 
       { 
          double ptsPos = SliderPositionToPTS(_track.Value); 
          _mpegDemux.CurrentStreamPTS = ptsPos; 
       } 
    } 
                      
         

  16. Add an event handler to the _capturectrl Complete event and code it as follows:

    VB
    Private Sub _capturectrl_Complete(ByVal sender As System.Object, ByVal e As EventArgs) Handles _capturectrl.Complete 
       MessageBox.Show("Capture Complete") 
       _buttonCapture.Enabled = true 
    End Sub 
                      
         

    C#
    private void _capturectrl_Complete(object sender, EventArgs e) 
    { 
       MessageBox.Show("Capture Complete"); 
       _buttonCapture.Enabled = true; 
    } 
                      
         

  17. Add an event handler to the _playctrl StateChanged event and code it as follows:

    VB
    Private Sub _playctrl_StateChanged(ByVal sender As Object, ByVal e As StateChangedEventArgs) Handles _playctrl.StateChanged 
       If e.state = PlayState.Running Then 
          _mpegDemux = Nothing 
          _mpegDemux = TryCast(_playctrl.GetSubObject(PlayObject.Splitter), LMMpgDmxT) 
       End If 
    End Sub 
                      
         

    C#
    private void _playctrl_StateChanged(object sender, StateChangedEventArgs e) 
    { 
       if (e.state == PlayState.Running) 
       { 
          _mpegDemux = null; 
          _mpegDemux = _playctrl.GetSubObject(PlayObject.Splitter) as LMMpgDmxT; 
       } 
    } 
                      
         

  18. Add an event handler to the _buttonCapture Click event and code it as follows:

    VB
    Private Sub _buttonCapture_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _buttonCapture.Click 
       Try 
          If _capturing = True Then 
             _capturectrl.StopCapture() 
          Else 
             Dim recVideoComp As String = String.Empty 
             Dim recAudioComp As String = String.Empty 
                     
             If IsStreaming() Then 
                _capturectrl.TargetFormats.DVR.Selected = True 
                _capturectrl.TargetFormat = TargetFormatType.DVR 
                _capturectrl.VideoCompressors.Selection = -1 
                _capturectrl.AudioCompressors.Selection = -1 
             Else 
                _capturectrl.TargetFormats.DVRTransport.Selected = True 
                recVideoComp = _capturectrl.TargetFormats.DVRTransport.RecommendedVideoCompressor 
                recAudioComp = _capturectrl.TargetFormats.DVRTransport.RecommendedAudioCompressor 
                _capturectrl.TargetFormat = TargetFormatType.DVRTransport 
                If recVideoComp <> String.Empty Then 
                   _capturectrl.VideoCompressors(recVideoComp).Selected = True 
                End If 
                If recAudioComp <> String.Empty Then 
                   _capturectrl.AudioCompressors(recAudioComp).Selected = True 
                End If 
                                  
                If _capturectrl.VideoCompressors.Mpeg2.Selected = True Then 
               Dim mpeg2Encoder As LMMPEG2Encoder = TryCast(_capturectrl.GetSubObject(CaptureObject.VideoCompressor), LMMPEG2Encoder) 
               If Not mpeg2Encoder Is Nothing Then 
                 mpeg2Encoder.EncodingThreads = eMpeg2EncodingThreads.MPEG2_THREAD_AUTO 
                 mpeg2Encoder.VideoFormat = eMPEG2VIDEOFORMAT.MPEG2_VF_NTSC 
                 Marshal.ReleaseComObject(mpeg2Encoder) 
               End If 
             End If 
             End If 
                     
             _capturectrl.Preview = True 
             _capturectrl.TargetFile = _targetFile 
                     
             _capturectrl.ReadyCapture(CaptureMode.VideoAndAudio Or CaptureMode.InhibitRun) 
             _dvrSink = TryCast(_capturectrl.GetSubObject(CaptureObject.Sink), ILMDVRSink) 
                     
             If Not _dvrSink Is Nothing Then 
                Dim dBuffSize As Double = 102400000 ' 100 MB 
                Dim lFileCount As Integer = 8 ' 8 buffer files 
                _dvrSink.StartChangingAttributes() 
                     
                _dvrSink.FolderCount = 1 
                _dvrSink.FolderName(0) = _targetFolder 
                _dvrSink.SetBufferSize(0, lFileCount, dBuffSize) 
                     
                _dvrSink.StopChangingAttributes(False) 
                Dim bufferFolder As String = _dvrSink.BaseName 
             End If 
                     
             _capturectrl.RunCapture() 
             _buttonCapture.Enabled = False 
             _capturing = True 
          End If 
       Catch ex As Exception 
          MessageBox.Show(ex.Message) 
       End Try 
    End Sub    
                      
         

    C#
    private void _buttonCapture_Click(object sender, System.EventArgs e) 
    { 
       try 
       { 
          if (_capturing == true) 
             _capturectrl.StopCapture(); 
          else 
          { 
             string recVideoComp = string.Empty; 
             string recAudioComp = string.Empty; 
                     
             if (IsStreaming()) 
             { 
                _capturectrl.TargetFormats.DVR.Selected = true; 
                _capturectrl.TargetFormat = TargetFormatType.DVR; 
                _capturectrl.VideoCompressors.Selection = -1; 
                _capturectrl.AudioCompressors.Selection = -1; 
             } 
             else 
             { 
                _capturectrl.TargetFormats.DVRTransport.Selected = true; 
                recVideoComp = _capturectrl.TargetFormats.DVRTransport.RecommendedVideoCompressor; 
                recAudioComp = _capturectrl.TargetFormats.DVRTransport.RecommendedAudioCompressor; 
                _capturectrl.TargetFormat = TargetFormatType.DVRTransport; 
                if (recVideoComp != string.Empty) 
                   _capturectrl.VideoCompressors[recVideoComp].Selected = true; 
                if (recAudioComp != string.Empty) 
                   _capturectrl.AudioCompressors[recAudioComp].Selected = true; 
                                     
                if (_capturectrl.VideoCompressors.Mpeg2.Selected == true) 
                { 
                  LMMPEG2Encoder mpeg2Encoder = _capturectrl.GetSubObject(CaptureObject.VideoCompressor) as LMMPEG2Encoder; 
                  if (mpeg2Encoder != null) 
                  { 
                     mpeg2Encoder.EncodingThreads = eMpeg2EncodingThreads.MPEG2_THREAD_AUTO; 
                     mpeg2Encoder.VideoFormat = eMPEG2VIDEOFORMAT.MPEG2_VF_NTSC; 
                     Marshal.ReleaseComObject(mpeg2Encoder); 
                  } 
                } 
             } 
                     
             _capturectrl.Preview = true; 
             _capturectrl.TargetFile = _targetFile; 
                     
             _capturectrl.ReadyCapture(CaptureMode.VideoAndAudio |   CaptureMode.InhibitRun); 
             _dvrSink = _capturectrl.GetSubObject(CaptureObject.Sink) as ILMDVRSink; 
                     
             if (_dvrSink != null) 
             { 
                double dBuffSize = 102400000;  // 100 MB 
                int lFileCount = 8;           // 8 buffer files 
                _dvrSink.StartChangingAttributes(); 
                     
                _dvrSink.FolderCount = 1; 
                _dvrSink.set_FolderName(0, _targetFolder); 
                _dvrSink.SetBufferSize(0, lFileCount, dBuffSize); 
                     
                _dvrSink.StopChangingAttributes(false); 
                string bufferFolder = _dvrSink.BaseName; 
             } 
                     
             _capturectrl.RunCapture(); 
             _buttonCapture.Enabled = false; 
             _capturing = true; 
          } 
       } 
       catch (Exception ex) 
       { 
          MessageBox.Show(this, ex.Message); 
       } 
    } 
                      
         

  19. Add an event handler to the _buttonPlay Click event and code it as follows:

    VB
    Private Sub _buttonPlay_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _buttonPlay.Click 
       Try 
          _mpegDemux = Nothing 
          _playCtrl.ResetSource() 
                     
          _playCtrl.PreferredMPEG2Splitter = Leadtools.Multimedia.Constants.Filter_MPEG2_Transport_Demux 
          _playctrl.SourceFile = Path.Combine(_targetFolder, _targetFile) 
          _playctrl.Run 
       Catch ex As Exception 
          MessageBox.Show(ex.Message) 
       End Try 
    End Sub    
                      
         

    C#
    private void _buttonPlay_Click(object sender, System.EventArgs e) 
    { 
       try 
       { 
          _mpegDemux = null; 
          _playCtrl.ResetSource(); 
                     
          _playCtrl.PreferredMPEG2Splitter = Constants.Filter_MPEG2_Transport_Demux; 
          _playctrl.SourceFile = Path.Combine(_targetFolder, _targetFile); 
          _playctrl.Run(); 
       } 
       catch (Exception ex) 
       { 
          MessageBox.Show(this, ex.Message); 
       } 
    } 
                      
         

  20. Build, and Run the program to test it.

Help Version 20.0.2018.1.19
Products | Support | Contact Us | Copyright Notices
© 1991-2018 LEAD Technologies, Inc. All Rights Reserved.
LEADTOOLS Multimedia