Leadtools.Multimedia Namespace > MultiStreamSource Class : GetSampleBuffer Method |
public MediaSample GetSampleBuffer( int Stream, int TimeOut )
'Declaration Public Function GetSampleBuffer( _ ByVal Stream As Integer, _ ByVal TimeOut As Integer _ ) As MediaSample
'Usage Dim instance As MultiStreamSource Dim Stream As Integer Dim TimeOut As Integer Dim value As MediaSample value = instance.GetSampleBuffer(Stream, TimeOut)
public MediaSample GetSampleBuffer( int Stream, int TimeOut )
public: MediaSample^ GetSampleBuffer( int Stream, int TimeOut )
Public _result As Boolean = False Public _form As ConvertCtrlForm = New ConvertCtrlForm() Public _convertctrl As ConvertCtrl ' input files and output file Private inFile1 As String = Path.Combine(LEAD_VARS.MediaDir, "ConvertCtrl_Source1.avi") Private inFile2 As String = Path.Combine(LEAD_VARS.MediaDir, "ConvertCtrl_Source2.avi") Private outFile As String = Path.Combine(LEAD_VARS.MediaDir, "ConvertCtrl_ConcatAVIFilesExample.avi") Public Sub ConcatAVIFilesExample() Dim pConvert1 As ConvertCtrl Dim pConvert2 As ConvertCtrl Dim pMSSource As MultiStreamSource Dim pMSTarget As MultiStreamTarget Dim lStart As Int64 Dim pmt As MediaType Dim pInsertedMediaType As MediaType pConvert1 = New ConvertCtrl(True) pConvert2 = New ConvertCtrl(True) pMSSource = New MultiStreamSource() pMSTarget = New MultiStreamTarget() ' set the start time to be 0 lStart = 0 ' set the input filename pConvert1.SourceFile = inFile1 ' set the output sample to a target object pMSTarget.StreamCount = 2 ' set the target media types for video and audio streams pmt = New MediaType() pmt.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Video pMSTarget.SetAcceptedMediaType(0, pmt) pmt.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Audio pMSTarget.SetAcceptedMediaType(1, pmt) pmt = Nothing ' get the inserted media type for the first stream pInsertedMediaType = pMSTarget.GetAcceptedMediaType(0) pInsertedMediaType = Nothing ' set convert 1 target object pConvert1.TargetObject = pMSTarget ' start the source conversion, so we can get the media sample format pConvert1.StartConvert() ' initialize convert 2 ' get the output media sample format and put it into the source object pMSSource.StreamCount = 2 pmt = pMSTarget.GetConnectedMediaType(0) pMSSource.SetMediaType(0, pmt) pmt = Nothing pmt = pMSTarget.GetConnectedMediaType(1) pMSSource.SetMediaType(1, pmt) pmt = Nothing ' get the inserted media type for the first stream pInsertedMediaType = pMSSource.GetMediaType(0) pInsertedMediaType = Nothing ' set the output filename pConvert2.TargetFile = outFile ' set the source for convert 2 pConvert2.SourceObject = pMSSource ' start the dest conversion pConvert2.StartConvert() ' convert first file ConcateFile(pConvert1, pMSTarget, pMSSource, lStart) ' 'Restrict the output format to the media type of the source for the first file 'That is because the two files must have the same media type for both video and audio 'With video, you have to make sure the files have the same frame rate! Minor changes in 'the frame rate might make the connection fail! 'The control will tolerate differences in frame rate if you comment the next line ' pmt = pMSTarget.GetConnectedMediaType(0) pMSTarget.SetAcceptedMediaType(0, pmt) pmt = Nothing pmt = pMSTarget.GetConnectedMediaType(1) pMSTarget.SetAcceptedMediaType(1, pmt) pmt = Nothing ' change the source file to second file pConvert1.SourceFile = inFile2 ' start converting again pConvert1.StartConvert() ' convert second file ConcateFile(pConvert1, pMSTarget, pMSSource, lStart) ' deliver end of sample to stop the conversion pMSSource.DeliverEndOfStream(0, 1000) pMSSource.DeliverEndOfStream(1, 1000) If pConvert2.State = ConvertState.Running Then pConvert2.StopConvert() End If ' free the source and target objects pConvert2.ResetSource() pConvert1.ResetTarget() pConvert1.Dispose() pConvert2.Dispose() pMSSource.Dispose() pMSTarget.Dispose() _result = File.Exists(outFile) End Sub Private Sub ConcateFile(ByVal pConvert1 As ConvertCtrl, _ ByVal pMSTarget As MultiStreamTarget, _ ByVal pMSSource As MultiStreamSource, _ ByRef lStart As Long) Dim pmsSrc As MediaSample = Nothing Dim pmsDst As MediaSample = Nothing Dim MediaTimeStart As Long Dim MediaTimeStop As Long Dim LastStart As Long Dim LastStop As Long Dim lSampleStream As Integer Dim lActualDataLength As Integer LastStop = 0 Do ' get the sample, allowing 10 s for the operation to complete Try lSampleStream = pMSTarget.WaitForSample(1000) Catch cex As COMException If cex.ErrorCode = CInt(ErrorCode.VFW_E_TIMEOUT) Then ' end of the stream Exit Do End If _result = False Exit Do End Try Try ' get the target sample pmsSrc = pMSTarget.GetSample(lSampleStream, 0) ' get the source buffer pmsDst = pMSSource.GetSampleBuffer(lSampleStream, 2000) Catch e1 As Exception _result = False Exit Do End Try ' get the media time pmsSrc.GetMediaTime(MediaTimeStart, MediaTimeStop) ' get the source sample time pmsSrc.GetTime(LastStart, LastStop) ' set the destination sample time pmsDst.SetTime(lStart + LastStart, lStart + LastStop) ' copy the data lActualDataLength = pmsSrc.ActualDataLength ' set the destination buffer ' we could Marshal the unmanaged buffer here, but no need since we are mearly ' setting the destination to the source buffer contents (unaltered data) pmsDst.SetData(lActualDataLength, pmsSrc.GetData(lActualDataLength)) ' copy the other flags pmsDst.Discontinuity = pmsSrc.Discontinuity pmsDst.Preroll = pmsSrc.Preroll pmsDst.SyncPoint = pmsSrc.SyncPoint ' release the source sample pmsSrc = Nothing ' deliver the destination sample pMSSource.DeliverSample(lSampleStream, 1000, pmsDst) ' release the destination sample pmsDst = Nothing Loop While True pConvert1.StopConvert() lStart = LastStop End Sub Public NotInheritable Class LEAD_VARS Public Const MediaDir As String = "C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 175\Media"; End Class
public bool _result = false; public ConvertCtrlForm _form = new ConvertCtrlForm(); public ConvertCtrl _convertctrl; // input files and output file string inFile1 = Path.Combine(LEAD_VARS.MediaDir,"ConvertCtrl_Source1.avi"); string inFile2 =Path.Combine(LEAD_VARS.MediaDir,"ConvertCtrl_Source2.avi"); string outFile =Path.Combine(LEAD_VARS.MediaDir,"ConvertCtrl_ConcatAVIFilesExample.avi"); public void ConcatAVIFilesExample() { ConvertCtrl pConvert1; ConvertCtrl pConvert2; MultiStreamSource pMSSource; MultiStreamTarget pMSTarget; Int64 lStart; MediaType pmt; MediaType pInsertedMediaType; pConvert1 = new ConvertCtrl(true); pConvert2 = new ConvertCtrl(true); pMSSource = new MultiStreamSource(); pMSTarget = new MultiStreamTarget(); // set the start time to be 0 lStart = 0; // set the input filename pConvert1.SourceFile = inFile1; // set the output sample to a target object pMSTarget.StreamCount = 2; // set the target media types for video and audio streams pmt = new MediaType(); pmt.Type = Constants.MEDIATYPE_Video; pMSTarget.SetAcceptedMediaType(0, pmt); pmt.Type = Constants.MEDIATYPE_Audio; pMSTarget.SetAcceptedMediaType(1, pmt); pmt = null; // get the inserted media type for the first stream pInsertedMediaType = pMSTarget.GetAcceptedMediaType(0); pInsertedMediaType = null; // set convert 1 target object pConvert1.TargetObject = pMSTarget; // start the source conversion, so we can get the media sample format pConvert1.StartConvert(); // initialize convert 2 // get the output media sample format and put it into the source object pMSSource.StreamCount = 2; pmt = pMSTarget.GetConnectedMediaType(0); pMSSource.SetMediaType(0, pmt); pmt = null; pmt = pMSTarget.GetConnectedMediaType(1); pMSSource.SetMediaType(1, pmt); pmt = null; // get the inserted media type for the first stream pInsertedMediaType = pMSSource.GetMediaType(0); pInsertedMediaType = null; // set the output filename pConvert2.TargetFile = outFile; // set the source for convert 2 pConvert2.SourceObject = pMSSource; // start the dest conversion pConvert2.StartConvert(); // convert first file ConcateFile(pConvert1, pMSTarget, pMSSource, ref lStart); /* Restrict the output format to the media type of the source for the first file That is because the two files must have the same media type for both video and audio With video, you have to make sure the files have the same frame rate! Minor changes in the frame rate might make the connection fail! The control will tolerate differences in frame rate if you comment the next line */ pmt = pMSTarget.GetConnectedMediaType(0); pMSTarget.SetAcceptedMediaType(0, pmt); pmt = null; pmt = pMSTarget.GetConnectedMediaType(1); pMSTarget.SetAcceptedMediaType(1, pmt); pmt = null; // change the source file to second file pConvert1.SourceFile = inFile2; // start converting again pConvert1.StartConvert(); // convert second file ConcateFile(pConvert1, pMSTarget, pMSSource, ref lStart); // deliver end of sample to stop the conversion pMSSource.DeliverEndOfStream(0, 1000); pMSSource.DeliverEndOfStream(1, 1000); if (pConvert2.State == ConvertState.Running) pConvert2.StopConvert(); // free the source and target objects pConvert2.ResetSource(); pConvert1.ResetTarget(); pConvert1.Dispose(); pConvert2.Dispose(); pMSSource.Dispose(); pMSTarget.Dispose(); _result = File.Exists(outFile); } void ConcateFile(ConvertCtrl pConvert1, MultiStreamTarget pMSTarget, MultiStreamSource pMSSource, ref long lStart) { MediaSample pmsSrc = null; MediaSample pmsDst = null; long MediaTimeStart; long MediaTimeStop; long LastStart; long LastStop; int lSampleStream; int lActualDataLength; LastStop = 0; do { // get the sample, allowing 10 s for the operation to complete try { lSampleStream = pMSTarget.WaitForSample(1000); } catch (COMException cex) { if (cex.ErrorCode == (int)ErrorCode.VFW_E_TIMEOUT) { // end of the stream break; } _result = false; break; } try { // get the target sample pmsSrc = pMSTarget.GetSample(lSampleStream, 0); // get the source buffer pmsDst = pMSSource.GetSampleBuffer(lSampleStream, 2000); } catch (Exception) { _result = false; break; } // get the media time pmsSrc.GetMediaTime(out MediaTimeStart, out MediaTimeStop); // get the source sample time pmsSrc.GetTime(out LastStart, out LastStop); // set the destination sample time pmsDst.SetTime(lStart + LastStart, lStart + LastStop); // copy the data lActualDataLength = pmsSrc.ActualDataLength; // set the destination buffer // we could Marshal the unmanaged buffer here, but no need since we are mearly // setting the destination to the source buffer contents (unaltered data) pmsDst.SetData(lActualDataLength, pmsSrc.GetData(lActualDataLength)); // copy the other flags pmsDst.Discontinuity = pmsSrc.Discontinuity; pmsDst.Preroll = pmsSrc.Preroll; pmsDst.SyncPoint = pmsSrc.SyncPoint; // release the source sample pmsSrc = null; // deliver the destination sample pMSSource.DeliverSample(lSampleStream, 1000, pmsDst); // release the destination sample pmsDst = null; } while (true); pConvert1.StopConvert(); lStart = LastStop; } static class LEAD_VARS { public const string MediaDir = @"C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 175\Media"; }
Target Platforms: Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2