using AVFoundation; using CoreGraphics; using CoreMedia; using CoreVideo; using SkiaSharp.Views.iOS; using System; using System.IO; using UIKit; namespace Demo.iOS.Controls { public class SampleBufferDelegate : AVCaptureVideoDataOutputSampleBufferDelegate { public override void DidOutputSampleBuffer(AVCaptureOutput captureOutput, CMSampleBuffer sampleBuffer, AVCaptureConnection connection) { try { using (var pixelBuffer = sampleBuffer.GetImageBuffer() as CVPixelBuffer) { pixelBuffer.Lock(CVPixelBufferLock.None); var flags = CGBitmapFlags.PremultipliedFirst | CGBitmapFlags.ByteOrder32Little; using (var cs = CGColorSpace.CreateDeviceRGB()) { using (var context = new CGBitmapContext(pixelBuffer.BaseAddress, pixelBuffer.Width, pixelBuffer.Height, 8, pixelBuffer.BytesPerRow, cs, (CGImageAlphaInfo)flags)) { using (var cgImage = context.ToImage()) { pixelBuffer.Unlock(CVPixelBufferLock.None); var uiImage = UIImage.FromImage(cgImage); using (var stream = new MemoryStream()) { uiImage.AsJPEG().AsStream().CopyTo(stream); var jpegBytes = stream.ToArray(); var skBitmap = cgImage.ToSKBitmap(); var base64 = Convert.ToBase64String(jpegBytes); } } } } } } catch (Exception ex) { ex.ToString(); } finally { try { sampleBuffer.Dispose(); } catch { } } } } }