c# xaml windows-store-apps windows-phone-8.1

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.