- lTimeout
- A timeout value specifying the maximum time to wait for the sample, in milliseconds.
Visual Basic (Declaration) | |
---|---|
Public Function GetSample( _ ByVal lTimeout As Integer _ ) As MediaSample |
Visual Basic (Usage) | Copy Code |
---|---|
Dim instance As SampleTarget Dim lTimeout As Integer Dim value As MediaSample value = instance.GetSample(lTimeout) |
C# | |
---|---|
public MediaSample GetSample( int lTimeout ) |
C++/CLI | |
---|---|
public: MediaSample^ GetSample( int lTimeout ) |
Parameters
- lTimeout
- A timeout value specifying the maximum time to wait for the sample, in milliseconds.
Return Value
A MediaSample objectVisual Basic | Copy Code |
---|---|
Public _result As Boolean = False Public _form As CaptureCtrlForm = New CaptureCtrlForm() Public Sub CaptureFrameExample() ' reference the capture control Dim capturectrl As CaptureCtrl = _form.CaptureCtrl ' output file Dim outFile As String = Path.Combine(LEAD_VARS.MediaDir, "CaptureCtrl_CaptureFrameExample.bmp") Try ' set the video capture device, use your capture device name here If capturectrl.VideoDevices("Logitech") Is Nothing Then Throw New Exception("No Logitech video device available") End If capturectrl.VideoDevices("Logitech").Selected = True ' create a new sample target Dim st As SampleTarget = New SampleTarget() ' set the target media type for the video stream Dim amt As MediaType = New MediaType() amt.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Video amt.SubType = Leadtools.Multimedia.Constants.MEDIASUBTYPE_RGB24 st.SetAcceptedMediaType(amt) ' assign the sample target to the capture control capturectrl.TargetObject = st capturectrl.TargetFormat = TargetFormatType.AVI ' prepare the manual frames capture capturectrl.ReadyCapture(CaptureMode.ManualFrames) ' do something before the capture starts If capturectrl.IsModeAvailable(CaptureMode.ManualFrames) Then End If ' set the capture mode to manual frames capturectrl.StartCapture(CaptureMode.ManualFrames) ' capture a frame capturectrl.CaptureFrame() ' create a media sample using the captured sample from above Dim ms As MediaSample = st.GetSample(-1) ' get the sample target's connected media type Dim mt As MediaType = st.GetConnectedMediaType() Dim bmp As Bitmap = WriteSampleBitmap(outFile, ms, mt) ' stop the capture capturectrl.StopCapture() ' check for the capture file and set the result If File.Exists(outFile) Then Dim test As Image = Bitmap.FromFile(outFile) _result = (test.Width = bmp.Width AndAlso test.Height = bmp.Height AndAlso test.PixelFormat = bmp.PixelFormat) End If Catch e1 As COMException _result = False Catch e2 As Exception _result = False End Try ' we'll loop on the state and pump messages for this example. ' but you should not need to if running from a Windows Forms application. Do While capturectrl.State = CaptureState.Running Application.DoEvents() Loop End Sub Private Function WriteSampleBitmap(ByVal outFile As String, ByVal ms As MediaSample, ByVal mt As MediaType) As Bitmap ' get the video information Dim vih As VideoInfoHeader = mt.GetVideoFormatData() ' create a bitmap to hold the sample and copy it Dim bmp As Bitmap = New Bitmap(vih.bmiHeader.biWidth, vih.bmiHeader.biHeight, FormatFromBitCount(vih.bmiHeader.biBitCount)) Dim bmpData As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat) Marshal.Copy(ms.Buffer, 0, bmpData.Scan0, GetBitmapSize(bmp, vih.bmiHeader.biBitCount)) bmp.UnlockBits(bmpData) ' flip the upside down buffer bmp.RotateFlip(RotateFlipType.Rotate180FlipX) ' save the image bmp.Save(outFile, ImageFormat.Bmp) Return bmp End Function Private Function FormatFromBitCount(ByVal bitCount As Integer) As PixelFormat Select Case bitCount Case 8 Return PixelFormat.Format8bppIndexed Case 16 Return PixelFormat.Format16bppRgb555 Case 32 Return PixelFormat.Format32bppRgb Case 48 Return PixelFormat.Format48bppRgb Case 24 Return PixelFormat.Format24bppRgb End Select Throw New Exception("Unrecognized bit count") End Function Private Function GetBitmapSize(ByVal bmp As Bitmap, ByVal bitCount As Integer) As Integer Dim pixelSize As Integer = CInt(Math.Log(CDbl(bitCount))) Return (bmp.Width * pixelSize + pixelSize And (Not 3)) * bmp.Height End Function Private Function GetBitmapScanRowSize(ByVal bmpSize As Integer, ByVal stride As Integer, ByVal width As Integer) As Integer Return CInt(bmpSize / (stride / width)) End Function Public Sub CaptureFrame_Helper(ByVal sender As Object, ByVal e As EventArgs) ' set result _result = True End Sub Public NotInheritable Class LEAD_VARS Public Const MediaDir As String = "C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 17\Media" End Class |
C# | Copy Code |
---|---|
public bool _result = false; public CaptureCtrlForm _form = new CaptureCtrlForm(); public void CaptureFrameExample() { // reference the capture control CaptureCtrl capturectrl = _form.CaptureCtrl; // output file string outFile = Path.Combine(LEAD_VARS.MediaDir,"CaptureCtrl_CaptureFrameExample.bmp"); try { // set the video capture device, use your capture device name here if (capturectrl.VideoDevices["Logitech"] == null) throw new Exception("No Logitech video device available"); capturectrl.VideoDevices["Logitech"].Selected = true; // create a new sample target SampleTarget st = new SampleTarget(); // set the target media type for the video stream MediaType amt = new MediaType(); amt.Type = Constants.MEDIATYPE_Video; amt.SubType = Constants.MEDIASUBTYPE_RGB24; st.SetAcceptedMediaType(amt); // assign the sample target to the capture control capturectrl.TargetObject = st; capturectrl.TargetFormat = TargetFormatType.AVI; // prepare the manual frames capture capturectrl.ReadyCapture(CaptureMode.ManualFrames); // do something before the capture starts if (capturectrl.IsModeAvailable(CaptureMode.ManualFrames)) { } // set the capture mode to manual frames capturectrl.StartCapture(CaptureMode.ManualFrames); // capture a frame capturectrl.CaptureFrame(); // create a media sample using the captured sample from above MediaSample ms = st.GetSample(-1); // get the sample target's connected media type MediaType mt = st.GetConnectedMediaType(); Bitmap bmp = WriteSampleBitmap(outFile, ms, mt); // stop the capture capturectrl.StopCapture(); // check for the capture file and set the result if (File.Exists(outFile)) { Image test = Bitmap.FromFile(outFile); _result = (test.Width == bmp.Width && test.Height == bmp.Height && test.PixelFormat == bmp.PixelFormat); } } catch (COMException) { _result = false; } catch (Exception) { _result = false; } // we'll loop on the state and pump messages for this example. // but you should not need to if running from a Windows Forms application. while (capturectrl.State == CaptureState.Running) Application.DoEvents(); } private Bitmap WriteSampleBitmap(string outFile, MediaSample ms, MediaType mt) { // get the video information VideoInfoHeader vih = mt.GetVideoFormatData(); // create a bitmap to hold the sample and copy it Bitmap bmp = new Bitmap(vih.bmiHeader.biWidth, vih.bmiHeader.biHeight, FormatFromBitCount(vih.bmiHeader.biBitCount)); BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); Marshal.Copy(ms.Buffer, 0, bmpData.Scan0, GetBitmapSize(bmp, vih.bmiHeader.biBitCount)); bmp.UnlockBits(bmpData); // flip the upside down buffer bmp.RotateFlip(RotateFlipType.Rotate180FlipX); // save the image bmp.Save(outFile, ImageFormat.Bmp); return bmp; } private PixelFormat FormatFromBitCount(int bitCount) { switch (bitCount) { case 8: return PixelFormat.Format8bppIndexed; case 16: return PixelFormat.Format16bppRgb555; case 32: return PixelFormat.Format32bppRgb; case 48: return PixelFormat.Format48bppRgb; case 24: return PixelFormat.Format24bppRgb; } throw new Exception("Unrecognized bit count"); } private int GetBitmapSize(Bitmap bmp, int bitCount) { int pixelSize = (int)Math.Log((double)bitCount); return (bmp.Width * pixelSize + pixelSize & ~3) * bmp.Height; } private int GetBitmapScanRowSize(int bmpSize, int stride, int width) { return bmpSize / (stride / width); } public void CaptureFrame_Helper(object sender, EventArgs e) { // set result _result = true; } static class LEAD_VARS { public const string MediaDir = @"C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 17\Media"; } |
If the method fails, an error is raised. For more information, refer to the Error Codes.
Common errors:
- VFW_E_TIMEOUT - [0x8004022E] The interval specified in 1Timeout has elapsed before a sample was ready. You can call the function again or increase the timeout value.
- VFW_E_SAMPLE_REJECTED_EOS - [0x8004022C] The end of stream has been reached. There are no more samples available for this stream.
Target Platforms: Microsoft .NET Framework 2.0, Windows 2000, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7