- Start Visual Studio .NET.
- Choose File->New->Project... from the menu.
- In the New Project dialog box, choose either "Visual C# Projects" or "Visual Basic Projects" in the Projects Type List, and choose "Windows Application " in the Templates List.
- Type the project name as "Multimedia MPEG2 Streaming" in the Project Name field, and then choose OK. If desired, type a new location for your project or select a directory using the Browse button, and then choose OK.
- In the "Solution Explorer" window, right-click on 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 on the "References" folder, and select "Add Reference..." from the context menu. In the "Add Reference" dialog box, select the "COM" tab and select LEAD MPEG-2 Transport Multiplexer Library and LEAD MPEG2 Transport Demultiplexer Library and click OK.
- Make sure Form1 is in design view. Go to the toolbox (View->Toolbox) and drag and drop a ConvertCtrl control and a PlayCtrl control on the form. NOTE: If you do not have ConvertCtrl or PlayCtrl controls in your toolbox, select Tools->Choose Toolbox Items from the menu. Click Browse and then select Leadtools.Multimedia.dll from "<LEADTOOLS_INSTALLDIR>\Bin\DotNet\Win32" and then click Open and then click OK. After adding these controls to the form, set the following properties:
Property Value Name _convertctrl Anchor Top, Left BackColor Black Name _playctrl Anchor Top, Bottom, Left, Right AutoStart False - Go to the toolbox (View->Toolbox) and drag and drop a Text control on the form (below the convert control) and set the following properties:
Property Value Name _txtSrcFile Anchor Bottom, Left Locked True - Go to the toolbox (View->Toolbox) and drag and drop a Button control to the right of the text control and set the following properties:
Property Value Name _buttonBrowse Text ... Anchor Bottom, Left - Go to the toolbox (View->Toolbox) and drag and drop a TrackBar control on the form (below the play control) and set the following properties:
Property Value Name _track Anchor Bottom, Left, Right Maximum 10000 - Go to the toolbox (View->Toolbox) and drag and drop two Button controls to the bottom of the form (one below the convert control and one below the play control) and set the following properties:
Property Value Name _buttonStartStop Text Start Anchor Bottom, Left Name _buttonPauseResume Text Pause Anchor Bottom, Right - Switch Form1 to code view (right-click Form1 in the solution explorer then select View Code) and add the following lines at the beginning of the file:
[Visual Basic]
Imports Leadtools.Multimedia Imports System.Runtime.InteropServices Imports LMMpg2MxTLib Imports LMMpgDmxTLib
[C#]using Leadtools.Multimedia; using System.Runtime.InteropServices; using LMMpg2MxTLib; using LMMpgDmxTLib;
- Declare the following private variable:
[Visual Basic]
Private Const SLIDER_MAX As Integer = 10000 Private _streaming As Boolean = False Private _firstPTS As Double Private _lastPTS As Double
[C#]Private const int SLIDER_MAX = 10000; Private bool _streaming = false; Private double _firstPTS; Private double _lastPTS;
- Add an event handler to the _convertctrl Started event and code it as follows:
[Visual Basic]
Private Sub _convertCtrl_Started(ByVal sender As Object, ByVal e As EventArgs) Handles _convertCtrl.Started _streaming = True _buttonBrowse.Enabled = False If _playctrl.State = PlayState.Stopped OrElse _playctrl.State = PlayState.NotReady Then _playctrl.SourceFile = _convertCtrl.TargetFile _playctrl.Run() End If End Sub
[C#]void _convertCtrl_Started(object sender, EventArgs e) { _streaming = true; _buttonBrowse.Enabled = false; if (_playctrl.State == PlayState.Stopped || _playctrl.State == PlayState.NotReady) { _playctrl.SourceFile = _convertCtrl.TargetFile; _playctrl.Run(); } }
- Add an event handler to the _convertctrl Complete event and code it as follows:
[Visual Basic]
Private Sub _convertCtrl_Complete(ByVal sender As Object, ByVal e As EventArgs) Handles _convertCtrl.Complete If _streaming = True Then _convertCtrl.StartConvert() Else _buttonStartStop.Text = "Start" _buttonBrowse.Enabled = True End If End Sub
[C#]void _convertCtrl_Complete(object sender, EventArgs e) { if (_streaming == true) _convertCtrl.StartConvert(); else { _buttonStartStop.Text = "Start"; _buttonBrowse.Enabled = true; } }
- Add an event handler to the _playctrl TrackingPositionChanged event and code it as follows:
[Visual Basic]
Private Sub _playctrl_TrackingPositionChanged(ByVal sender As Object, ByVal e As TrackingPositionChangedEventArgs) Handles _playctrl.TrackingPositionChanged Dim demux As LMMpgDmxT = TryCast(_playctrl.GetSubObject(PlayObject.Splitter), LMMpgDmxT) If Not demux Is Nothing Then demux.RefreshPosition(0) _firstPTS = demux.FirstStreamPTS _lastPTS = demux.LastStreamPTS _track.Value = PTSToSliderPosition(demux.CurrentStreamPTS) Marshal.ReleaseComObject(demux) End If End Sub
[C#]void _playctrl_TrackingPositionChanged(object sender, TrackingPositionChangedEventArgs e) { LMMpgDmxT demux = _playctrl.GetSubObject(PlayObject.Splitter) as LMMpgDmxT; if (demux != null) { demux.RefreshPosition(0); _firstPTS = demux.FirstStreamPTS; _lastPTS = demux.LastStreamPTS; _track.Value = PTSToSliderPosition(demux.CurrentStreamPTS); Marshal.ReleaseComObject(demux); } }
- Add an event handler to the _track Scroll event and code it as follows:
[Visual Basic]
Private Sub _track_Scroll(ByVal sender As Object, ByVal e As EventArgs) Handles _track.Scroll Dim demux As LMMpgDmxT = TryCast(_playctrl.GetSubObject(PlayObject.Splitter), LMMpgDmxT) If Not demux Is Nothing Then demux.RefreshPosition(0) demux.CurrentStreamPTS = SliderPositionToPTS(_track.Value) Marshal.ReleaseComObject(demux) End If End Sub
[C#]private void _track_Scroll(object sender, EventArgs e) { LMMpgDmxT demux = _playctrl.GetSubObject(PlayObject.Splitter) as LMMpgDmxT; if (demux != null) { demux.RefreshPosition(0); demux.CurrentStreamPTS = SliderPositionToPTS(_track.Value); Marshal.ReleaseComObject(demux); } }
- Add the following helper methods for use by the _track control's scroll and _playctrl track positioning handlers:
[Visual Basic]
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 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; }
- Add an event handler to the _buttonBrowse Click event and code it as follows:
[Visual Basic]
Private Sub _btnBrowse_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _buttonBrowse.Click Dim ofn As OpenFileDialog = New OpenFileDialog() ofn.FileName = _txtSrcFile.Text ofn.FilterIndex = 0 If _txtSrcFile.Text <> String.Empty Then ofn.InitialDirectory = Path.GetDirectoryName(_txtSrcFile.Text) Else ofn.InitialDirectory = Directory.GetCurrentDirectory() End If ofn.Multiselect = False ofn.Title = "Select Source Video" ofn.CheckFileExists = True ofn.Filter = "MPEG2 Video Files (*.mpg)|*.mpg|All files (*.*)|*.*" If ofn.ShowDialog() = DialogResult.OK Then _txtSrcFile.Text = ofn.FileName End If End Sub
[C#]private void _btnBrowse_Click(object sender, EventArgs e) { OpenFileDialog ofn = new OpenFileDialog(); ofn.FileName = _txtSrcFile.Text; ofn.FilterIndex = 0; if (_txtSrcFile.Text != string.Empty) ofn.InitialDirectory = Path.GetDirectoryName(_txtSrcFile.Text); else ofn.InitialDirectory = Directory.GetCurrentDirectory(); ofn.Multiselect = false; ofn.Title = "Select Source Video"; ofn.CheckFileExists = true; ofn.Filter = "MPEG2 Video Files (*.mpg)|*.mpg|All files (*.*)|*.*"; if (ofn.ShowDialog() == DialogResult.OK) { _txtSrcFile.Text = ofn.FileName; } }
- Add an event handler to the _buttonStartStop Click event and code it as follows:
[Visual Basic]
Private Sub _btnStartStop_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _buttonStartStop.Click Dim srcFile As String = _txtSrcFile.Text If _streaming = False Then If srcFile <> String.Empty AndAlso File.Exists(srcFile) Then _convertCtrl.SourceFile = srcFile _convertCtrl.AllowedStreams = StreamFormatType.AudioVideoCC _convertCtrl.PreferredMPEG2Splitter = Leadtools.Multimedia.Constants.Filter_MPEG2_Transport_Demux _convertCtrl.TargetFormat = TargetFormatType.MPEG2Transport _convertCtrl.Preview = True _convertCtrl.TargetFile = "udp://127.0.0.1:9005" Dim mux As LMMpg2MxT = TryCast(_convertCtrl.GetSubObject(ConvertObject.TargetFilter), LMMpg2MxT) If Not mux Is Nothing Then mux.OutputType = CInt(LMMpg2MxTLib.Mpg2MxT_OutputType.Mpg2MxT_OutputType_Broadcast) mux.ResyncInterval = 10 Marshal.ReleaseComObject(mux) End If Try _convertCtrl.StartConvert() _buttonStartStop.Text = "Stop" _buttonBrowse.Enabled = False Catch e1 As Exception End Try End If Else If _streaming = True Then _convertCtrl.StopConvert() _buttonStartStop.Text = "Start" _buttonBrowse.Enabled = True End If End If End Sub
[C#]private void _btnStartStop_Click(object sender, EventArgs e) { string srcFile = _txtSrcFile.Text; if (_streaming == false) { if (srcFile != string.Empty && File.Exists(srcFile)) { _convertCtrl.SourceFile = srcFile; _convertCtrl.AllowedStreams = StreamFormatType.AudioVideoCC; _convertCtrl.PreferredMPEG2Splitter = Constants.Filter_MPEG2_Transport_Demux; _convertCtrl.TargetFormat = TargetFormatType.MPEG2Transport; _convertCtrl.Preview = true; _convertCtrl.TargetFile = @"udp://127.0.0.1:9005"; LMMpg2MxT mux = _convertCtrl.GetSubObject(ConvertObject.TargetFilter) as LMMpg2MxT; if (mux != null) { mux.OutputType = (int)LMMpg2MxTLib.Mpg2MxT_OutputType.Mpg2MxT_OutputType_Broadcast; mux.ResyncInterval = 10; Marshal.ReleaseComObject(mux); } try { _convertCtrl.StartConvert(); _buttonStartStop.Text = "Stop"; _buttonBrowse.Enabled = false; } catch (Exception) { } } } else { if (_streaming == true) { _convertCtrl.StopConvert(); _buttonStartStop.Text = "Start"; _buttonBrowse.Enabled = true; } } }
- Add an event handler to the _buttonPauseResume Click event and code it as follows:
[Visual Basic]
Private Sub _buttonPauseResume_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _buttonPauseResume.Click If _playctrl.State = PlayState.Running Then _playctrl.Pause() _buttonPauseResume.Text = "Resume" ElseIf _playctrl.State = PlayState.Paused Then _playctrl.Run() _buttonPauseResume.Text = "Pause" End If End Sub
[C#]private void _buttonPauseResume_Click(object sender, EventArgs e) { if (_playctrl.State == PlayState.Running) { _playctrl.Pause(); _buttonPauseResume.Text = "Resume"; } else if (_playctrl.State == PlayState.Paused) { _playctrl.Run(); _buttonPauseResume.Text = "Pause"; } }
- Build, and Run the program to test it. Click the [...] browse button to locate a video file for the convert / streaming output. Then click the Start button to begin streaming. Finally, click the Pause/Resume button to test pause and resume on the play control OR drag the track bar control to reposition the stream playback.