public MediaSample GetSampleBuffer(int Stream,int TimeOut)
public:MediaSample^ GetSampleBuffer(int Stream,int TimeOut)
Stream
The zero-based index that indicates the stream for which to get the sample buffer.
TimeOut
Maximum time to wait for a free sample buffer, in milliseconds. If TimeOut is -1, the method's time-out interval never elapses.
A MediaSample object that represents the sample buffer.
The buffer retrieved by this method comes from a pool of buffers. Make no assumptions on the number of available buffers. If you get a buffer, fill it with data and then deliver it downstream with DeliverSample. Release the buffer (by setting the reference to Nothing) before getting another. This is because there can only be one buffer available at a time. If the method fails, an error is raised. For more information, refer to the Error Codes. If the method does not retrieve a buffer within the allotted time it will return VFW_E_TIMEOUT [0x8004022E]. If this happens, the timeout specified may be too small and all of the available buffers are currently being sent downstream. If you get the sample in .NET, call System.Runtime.InteropServices.Marshal.ReleaseComObject to release the sample before getting another sample.
using Leadtools;using Leadtools.Multimedia;using LeadtoolsMultimediaExamples.Fixtures;public bool _result = false;public ConvertCtrlForm _form = new ConvertCtrlForm();public ConvertCtrl _convertctrl;// input files and output filestring 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, lVideoMediaStart, lAudioMediaStart;MediaType pmt;MediaType pInsertedMediaType;pConvert1 = new ConvertCtrl(true);pConvert2 = new ConvertCtrl(true);pMSSource = new MultiStreamSource();pMSTarget = new MultiStreamTarget();// set the start time to be 0lStart = 0;lVideoMediaStart = 0;lAudioMediaStart = 0;// set the input filenamepConvert1.SourceFile = inFile1;// set the output sample to a target objectpMSTarget.StreamCount = 2;// set the target media types for video and audio streamspmt = 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 streampInsertedMediaType = pMSTarget.GetAcceptedMediaType(0);pInsertedMediaType = null;// set convert 1 target objectpConvert1.TargetObject = pMSTarget;// start the source conversion, so we can get the media sample formatpConvert1.StartConvert();// initialize convert 2// get the output media sample format and put it into the source objectpMSSource.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 streampInsertedMediaType = pMSSource.GetMediaType(0);pInsertedMediaType = null;// set the output filenamepConvert2.TargetFile = outFile;// set the source for convert 2pConvert2.SourceObject = pMSSource;// start the dest conversionpConvert2.StartConvert();// convert first fileConcateFile(pConvert1, pMSTarget, pMSSource, ref lStart, ref lVideoMediaStart, ref lAudioMediaStart);/*Restrict the output format to the media type of the source for the first fileThat is because the two files must have the same media type for both video and audioWith video, you have to make sure the files have the same frame rate! Minor changes inthe 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 filepConvert1.SourceFile = inFile2;// start converting againpConvert1.StartConvert();// convert second fileConcateFile(pConvert1, pMSTarget, pMSSource, ref lStart, ref lVideoMediaStart, ref lAudioMediaStart);// deliver end of sample to stop the conversionpMSSource.DeliverEndOfStream(0, 1000);pMSSource.DeliverEndOfStream(1, 1000);if (pConvert2.State == ConvertState.Running)pConvert2.StopConvert();// free the source and target objectspConvert2.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,ref long lVideoMediaStart,ref long lAudioMediaStart){MediaSample pmsSrc = null;MediaSample pmsDst = null;long MediaTimeStart;long MediaTimeStop;long LastVideoMediaStop;long LastAudioMediaStop;long LastStart;long LastStop;int lSampleStream;int lActualDataLength;LastStop = 0;LastVideoMediaStop = 0;LastAudioMediaStop = 0;do{// get the sample, allowing 10 s for the operation to completetry{lSampleStream = pMSTarget.WaitForSample(1000);}catch (COMException cex){if (cex.ErrorCode == (int)ErrorCode.VFW_E_TIMEOUT){// end of the streambreak;}_result = false;break;}try{// get the target samplepmsSrc = pMSTarget.GetSample(lSampleStream, 0);// get the source bufferpmsDst = pMSSource.GetSampleBuffer(lSampleStream, 2000);}catch (Exception){_result = false;break;}try{// get the source media timepmsSrc.GetMediaTime(out MediaTimeStart, out MediaTimeStop);// check sample media typeMediaType sampleMediaType = pMSTarget.GetConnectedMediaType(lSampleStream);if (sampleMediaType.Type == Constants.MEDIATYPE_Video) // video stream media time{pmsDst.SetMediaTime(MediaTimeStart + lVideoMediaStart, MediaTimeStop + lVideoMediaStart);LastVideoMediaStop = MediaTimeStop;}else // audio stream media time{pmsDst.SetMediaTime(MediaTimeStart + lAudioMediaStart, MediaTimeStop + lAudioMediaStart);LastAudioMediaStop = MediaTimeStop;}}catch (Exception){pmsDst.ResetMediaTime();}try{// get the source sample timepmsSrc.GetTime(out LastStart, out LastStop);// set the destination sample timepmsDst.SetTime(lStart + LastStart, lStart + LastStop);}catch(Exception){pmsDst.ResetTime();}// copy the datalActualDataLength = 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 flagspmsDst.Discontinuity = pmsSrc.Discontinuity;pmsDst.Preroll = pmsSrc.Preroll;pmsDst.SyncPoint = pmsSrc.SyncPoint;// dispose the source sample, since we don't need it anymore. This makes the buffer available for reusepmsSrc.Dispose();// deliver the destination samplepMSSource.DeliverSample(lSampleStream, 1000, pmsDst);// dispose the destination sample, since we don't need it anymore. This makes the buffer available for reusepmsDst.Dispose();}while (true);pConvert1.StopConvert();lStart += LastStop;lVideoMediaStart += LastVideoMediaStop;lAudioMediaStart += LastAudioMediaStop;}static class LEAD_VARS{public const string MediaDir = @"C:\LEADTOOLS23\Media";}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
