You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/labs/Demo/Demo.iOS/Controls/SampleBufferDelegate.cs

64 lines
2.3 KiB

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
{
}
}
}
}
}