c# - Acceda al marco de vista previa de MediaCapture
xaml windows-store-apps (1)
Hay una muestra en la página de github de Microsoft que es relevante, aunque apuntan a Windows 10. Puede que esté interesado en migrar su proyecto para obtener esta funcionalidad.
GetPreviewFrame : esta muestra capturará marcos de vista previa en lugar de fotos completas. Una vez que tiene un marco de vista previa, puede editar los píxeles en él.
Aquí está la parte relevante:
private async Task GetPreviewFrameAsSoftwareBitmapAsync()
{
// Get information about the preview
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
// Create the video frame to request a SoftwareBitmap preview frame
var videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);
// Capture the preview frame
using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame))
{
// Collect the resulting frame
SoftwareBitmap previewFrame = currentFrame.SoftwareBitmap;
// Add a simple green filter effect to the SoftwareBitmap
EditPixels(previewFrame);
}
}
private unsafe void EditPixels(SoftwareBitmap bitmap)
{
// Effect is hard-coded to operate on BGRA8 format only
if (bitmap.BitmapPixelFormat == BitmapPixelFormat.Bgra8)
{
// In BGRA8 format, each pixel is defined by 4 bytes
const int BYTES_PER_PIXEL = 4;
using (var buffer = bitmap.LockBuffer(BitmapBufferAccessMode.ReadWrite))
using (var reference = buffer.CreateReference())
{
// Get a pointer to the pixel buffer
byte* data;
uint capacity;
((IMemoryBufferByteAccess)reference).GetBuffer(out data, out capacity);
// Get information about the BitmapBuffer
var desc = buffer.GetPlaneDescription(0);
// Iterate over all pixels
for (uint row = 0; row < desc.Height; row++)
{
for (uint col = 0; col < desc.Width; col++)
{
// Index of the current pixel in the buffer (defined by the next 4 bytes, BGRA8)
var currPixel = desc.StartIndex + desc.Stride * row + BYTES_PER_PIXEL * col;
// Read the current pixel information into b,g,r channels (leave out alpha channel)
var b = data[currPixel + 0]; // Blue
var g = data[currPixel + 1]; // Green
var r = data[currPixel + 2]; // Red
// Boost the green channel, leave the other two untouched
data[currPixel + 0] = b;
data[currPixel + 1] = (byte)Math.Min(g + 80, 255);
data[currPixel + 2] = r;
}
}
}
}
}
Y declara esto fuera de tu clase:
[ComImport]
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}
Y, por supuesto, su proyecto deberá permitir que el código no sea seguro para que todo esto funcione.
Eche un vistazo más de cerca a la muestra para ver cómo obtener todos los detalles. O bien, para obtener un tutorial, puede ver la sesión de la cámara desde la // compilación / conferencia reciente, que incluye un pequeño recorrido a través de algunas muestras de cámara.
Me gustaría obtener los marcos de vista previa que se muestran dentro de mi elemento CaptureElement
xaml. La source
de mi CaptureElement
está configurada en un objeto MediaCapture
y uso el método StartPreview()
para comenzar a mostrar la cámara. Me gustaría acceder a los marcos que se muestran sin guardarlos en un archivo img o de video. El objetivo es capturar 10 fps de la vista previa y enviar cada cuadro a otra clase que acepte byte [] .
Intenté utilizar el método CapturePhotoToStorageFileAsync
sin embargo, esta no es una opción viable ya que no quiero tomar 10 imágenes reales por segundo. Tampoco quiero usar ScreenCapture
ya que almacena lo que se captura en un archivo de video. Lo ideal es que no desee almacenar ningún archivo multimedia temporalmente en el teléfono. Después de mirar el msdn para MediaCapture
, noté que hay un método llamado GetPreviewFrameAsync()
sin embargo, este método no existe dentro de Windows Phone 8.1. También tropecé con este ejemplo, sin embargo, no entiendo completamente cómo funciona.
Cualquier sugerencia sobre cómo abordar esto es muy apreciada.