Supongamos que estamos realizando una aplicació y necesitamos ver lo que estamos enfocando con la cámara ya sea para iniciar una grabación, tomar una foto o simplemente, como en mi caso para hacer una linterna con cámara (Torch8). Dado que ya tenemos disponible el desarrollo para Windows 10 (desktop y mobile) la información escasea acerca de esta temática para la plataforma Windows Phone 8.1 y Windows 8.1, así que he recopilado lo que he encontrado al respecto y os lo condensaré en este artículo.
Seleccionar cámara
Para empezar, debemos seleccionar la cámara del dispositivo dado que podemos tener delantera, trasera o las dos.
// Get all the cameras
DeviceInformationCollection cameras = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
// Selecting frotal camera
DeviceInformation frontCam = (from webcam in cameras
where webcam.EnclosureLocation != null
&& webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front
select webcam).FirstOrDefault();
// Selecting rear camera
DeviceInformation rearCam = (from webcam in cameras
where webcam.EnclosureLocation != null
&& webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
select webcam).FirstOrDefault();
Inicializar parámetros de captura
Una vez tengamos la cámara deseada, tendremos que inicializar la captura de vídeo con los parámetros que necesitemos como por ejemplo el código que muestro a continuación
// Initialize MediaCapture parameters
await mediaCapture.InitializeAsync(new MediaCaptureInitializationSettings
{
VideoDeviceId = rearCam.Id, // Using rear camera
AudioDeviceId = "", // Don’t capture audio
StreamingCaptureMode = StreamingCaptureMode.Video, // We want to capture video
PhotoCaptureSource = PhotoCaptureSource.VideoPreview // Capture mode (Auto | Photo | VideoPreview)
});
Comenzar a obtener visualización de la cámara
Llegados a este punto, ya podemos visualizar lo que enfoquemos con la cámara en nuestro dispositivo y, para ello necesitamos tener preparado el control en la vista XAML y referenciarlo desde el código C#
XAML
<CaptureElement Name="PreviewControl"
Stretch="UniformToFill"
/>
C#
// Set primary use as Video.
mediaCapture.VideoDeviceController.PrimaryUse = Windows.Media.Devices.CaptureUse.Video;
// Set the source of the CaptureElement to your MediaCapture
PreviewControl.Source = mediaCapture;
// Start Preview of Video.
await mediaCapture.StartPreviewAsync();
Más información
Toda esta información y podéis encontrarla con mayor profundidad en este enlace de MSDN
Nota Importante
Debeis recordar que es absolutamente necesario liberar los recursos de la cámara al cerrar/suspender la aplicación ya que si no, puede haber conflictos con otras aplicaciones e incluso la nuestra no funcionará como esperamos, para ello, en el enlace que os he puesto tenéis a vuestra dispocisión una muestra de código para limpiar los recursos
public async Task CleanupCaptureResources() { if (IsRecording && MediaCapture != null) { await MediaCapture.StopRecordAsync(); IsRecording = false; } if (IsPreviewing && MediaCapture != null) { await MediaCapture.StopPreviewAsync(); IsPreviewing = false; } if (MediaCapture != null) { if (PreviewElement != null) { PreviewElement.Source = null; } MediaCapture.Dispose(); } }
Esta limpieza debéis llevarla a cabo al menos al suspender la aplicación tal y como os copio y pego de la documentación
private async void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); //cleanup camera resources await CleanupCaptureResources(); deferral.Complete(); }
No obstante debéis consultar en profundidad la documentación acerca de los estados y el ciclo de vida de las aplicaciones Windows Phone 8.1 o incluso estudiar la posibilidad de manejar la suspensión en la vista tal y como se explica en este artículo de MSDN.
Espero que os sea de ayuda. Enjoy coding!!!