Perform the following steps to create and run a multimedia MPEG2 Streaming application using the LEADTOOLS Multimedia ConvertCtrl and PlayCtrl controls.
-
Start Visual Studio .NET.
-
Choose File->New->Project... from the menu.
-
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.
-
Type the project name as "Multimedia MPEG2 Streaming" 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.
-
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 MPEG-2 Transport Multiplexer Library
- LEAD MPEG-2 Transport Demultiplexer 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.
-
Make sure Form1 is in design view. Go to the toolbox (View->Toolbox) and drag 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 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 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 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 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 choose View Code) and add the following lines to the beginning of the file:
Imports Leadtools.Multimedia
Imports System.Runtime.InteropServices
Imports LMMpg2MxTLib
Imports LMMpgDmxTLib
using Leadtools.Multimedia;
using System.Runtime.InteropServices;
using LMMpg2MxTLib;
using LMMpgDmxTLib;
-
Declare the following private variable:
Private Const SLIDER_MAX As Integer = 10000
Private _streaming As Boolean = False
Private _firstPTS As Double
Private _lastPTS As Double
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:
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
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:
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
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:
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
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:
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
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:
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
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:
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
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:
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
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:
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
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.