Featured Posts

Silverlight 5 Ya DisponibleSilverlight 5 Ya Disponible El día de hoy 09 de Diciembre 2011 ha sido liberada la nueva versión de Silverlight 5.  Esta versión final es la 5.0.61118. ¿Qué es Silverlight? Silverlight es...

Readmore

Silverlight Tour–Actualizado a Silverlight 5 RTWSilverlight Tour–Actualizado a Silverlight 5... Tengo el gusto de anunciarles que el Curso que Da La Vuelta al Mundo, el famoso Silverlight Tour, ha sido actualizado a la versión final de Silverlight 5. El Silverlight...

Readmore

Nueva carrera en Microsoft Virtual Academy: Windows Phone 7.1 (Mango)Nueva carrera en Microsoft Virtual Academy: Windows... Tengo el gusto de darles a conocer la disponibilidad de una nueva carrera en el Microsoft Virtual Academy (MVA): La carrera de Windows Phone 7.1 Mango. Esta es la descripción...

Readmore

Nueva carrera en Microsoft Virtual Academy: Silverlight 4Nueva carrera en Microsoft Virtual Academy: Silverlight... ¿Eres estudiante de Microsoft Virtual Academy (MVA)? Tengo el gusto de anunciarles oficialmente el lanzamiento de la nueva carrera de Silverlight 4 para esta plataforma educativa. La...

Readmore

Curso gratuito de Introducción a Silverlight 4 – 2da. ParteCurso gratuito de Introducción a Silverlight... Tengo el gusto de informarles que ya está disponible la segunda parte del Curso gratuito de Introducción a Silverlight 4 en Español, el cual ahora consta de un total...

Readmore

Rodrigo Díaz Concha Rss

Silverlight 4 Beta – Soporte de Webcam y Micrófono

Posted on : 24-11-2009 | By : Rodrigo | In : Silverlight 4

Tags: , , , ,

3

Con la llegada de Silverlight 4 Beta también ha llegado a nosotros la posibilidad de implementar en nuestras aplicaciones la capacidad de tomar video a través de la Webcam y capturar audio por medio del micrófono del equipo.  Este fue una de las peticiones más fuertes en Silverlight 3 y la espera ha terminado.  En este artículo veremos cómo usar la Webcam en un aplicativo de Silverlight para mostrar el video y además capturar imágenes para posteriormente mostrarlas en una lista.

El proyecto

En esta demostración crearemos una aplicación que capture el video por medio de la WebCam del usuario y además que vaya tomando fotos según un intervalo de tiempo configurable.  Cada foto tomada se mostrará en la lista de fotos (control ListBox de color gris).

Crearemos un nuevo proyecto de Silverlight 4 desde Visual Studio 2010 Beta 2 y le nombraremos Demo.SL4.WebcamMic.  Aceptaremos las opciones por default para la creación del proyecto Web de prueba.  MainPage.xaml tendrá el siguiente código:

<UserControl
    x:Class="Demo.SL4.WebcamMic.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
             xmlns:tk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
    d:DesignHeight="300" d:DesignWidth="800">
    <UserControl.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground"
                    Value="White" />
            <Setter Property="VerticalAlignment"
                    Value="Center" />
            <Setter Property="Margin"
                    Value="5" />
        </Style>
        <Style TargetType="Button">
            <Setter Property="Width"
                    Value="100" />
            <Setter Property="Margin"
                    Value="5" />
            <Setter Property="FontSize"
                    Value="14" />
        </Style>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="Black">
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="150" />
            <RowDefinition Height="35" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Text="Silverlight 4 Beta – Webcam y Micrófono"
                   FontSize="30"
                   HorizontalAlignment="Center"
                   />
        <Rectangle x:Name="captura"
                   Grid.Row="1"
                   Width="120"
                   Height="120"
                   RadiusX="10"
                   RadiusY="10"
                   Stroke="White"
                   StrokeThickness="3">
            <Rectangle.Fill>
                <RadialGradientBrush>
                    <GradientStop Color="White"
                                  Offset="0.005" />
                    <GradientStop Color="Black"
                                  Offset="0.20" />
                </RadialGradientBrush>
            </Rectangle.Fill>
        </Rectangle>
            <StackPanel Orientation="Horizontal" Grid.Row="2" HorizontalAlignment="Center">
            <Button Content="Iniciar" Click="Button_Click" Tag="Iniciar" />
            <Button Content="Parar" Click="Button_Click" Tag="Parar" />
            <Button Content="Borrar" Click="Button_Click" Tag="Borrar" />
            <TextBlock Text="Intervalo:" />
            <Slider Width="100" Height="20" Minimum="1" Maximum="10" SmallChange="1" x:Name="intervalo" />
            <TextBlock Text="{Binding Value, ElementName=intervalo}" />
            <TextBlock Text="segundo(s)" />
        </StackPanel>
        
          <ListBox x:Name="listaFotos"
                 Grid.Row="3" Margin="5" Background="LightGray"
                 ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                 >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Image Source="{Binding}"
                           Width="100">
                        <Image.Effect>
                            <DropShadowEffect />
                        </Image.Effect>
                    </Image>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <tk:WrapPanel />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>

    </Grid>
</UserControl>

image

Los elementos a destacar son los siguientes:

  • El rectángulo llamado captura nos servirá para mostrar el video de la WebCam.
  • Los botones Iniciar, Parar y Borrar nos servirán para iniciar la captura de video, parar la captura de video y borrar todas las fotos que se hayan tomado respectivamente.
  • El slider de intervalo de tiempo nos servirá para controlar el tiempo que transcurrirá entre foto y foto.

Detallado lo anterior, ahora explicaremos las clases para soportar esta funcionalidad.

Clase CaptureDeviceConfiguration

La clase CaptureDeviceConfiguration tiene diferentes objetivos.  El primero y el más importante es determinar si el usuario nos ha dado permiso para usar su Webcam / Micrófono.  Esto está indicado en la propiedad AllowedDeviceAccess.  Asimismo contamos con el método RequestDeviceAccess() el cuál mostrará una caja de diálogo al usuario indicándole que la aplicación en cuestión desea usar la Webcam y Micrófono de su equipo:

image

Si el usuario decide dar permiso a la aplicación, la propiedad AllowedDeviceAccess será true y estaremos listos para utilizar esos dispositivos.  Además, la clase CaptureDeviceConfiguration expone los siguientes métodos:

GetDefaultAudioCaptureDevice()

GetDefaultVideoCaptureDevice()

GetAvailableAudioCaptureDevice()

GetAvailableVideoCaptureDevice()

La diferencia entre los primeros dos y los últimos dos es que los primeros nos regresarán el dispositivos de audio o video respectivamente configurado como default en el equipo, mientras que los últimos dos nos regresarán una colección de dispositivos de audio y video disponibles.

Clase CaptureSource

Será en la clase CaptureSource donde encontraremos las funciones necesarias para comenzar a capturar el video y adicionalmente capturar imágenes de ese video.

Las propiedades VideoCaptureDevice y AudioCaptureDevice indican los dispositivos de video y audio respectivamente a usar, mientras que su método Start() inicia la captura de video.  Será a través de una brocha de tipo VideoBrush el medio por el cual mostraremos el video, pintándolo en el rectángulo explicado con anterioridad.

if (CaptureDeviceConfiguration.AllowedDeviceAccess ||
                CaptureDeviceConfiguration.RequestDeviceAccess())
            {

                fuente.Stop();

                //Indica los dispositivos para captura de video y audio respectivamente
                fuente.VideoCaptureDevice = vcd;
                fuente.AudioCaptureDevice = acd;

                //Creamos una nueva brocha de video para 'pintar' con ella el rectángulo
                VideoBrush brocha = new VideoBrush() { Stretch = System.Windows.Media.Stretch.Uniform };
                brocha.SetSource(fuente);
                captura.Fill = brocha;

                //Inicia la captura de video
                fuente.Start();
                
                //Inicia el timer para capturar fotos
                timer.Start();

            }

Finalmente, para capturar imágenes del video utilizamos el método AsyncCaptureImage el cual recibe un delegado de tipo Action<WriteableBitmap> como parámetro.  En el delegado podemos obtener la imagen capturada para potencialmente guardarla en disco o simplemente mostrarla en un elemento de tipo Image.  En nuestro ejemplo estamos usando una colección de tipo ObservableCollection<WriteableBitmap> en donde iremos agregando todas las fotos tomadas automáticamente por la aplicación, y, debido a que esta colección está atada al Listbox y por tratarse de un ObservableCollection, la lista es actualizada de manera adecuada automáticamente sin código extra.  Las fotos son tomadas en el evento Tick de un DispatcherTimer en el intervalo de tiempo establecido por el usuario usando el control Slider (por default el valor es 1 segundo).

timer.Interval = TimeSpan.FromSeconds(intervalo.Value);
            timer.Tick += (s, a) =>
            {
                //Captura la imagen y la agrega a la colección de fotos
                fuente.AsyncCaptureImage((imagen) =>
                {
                    fotos.Add(imagen);
                });
            };

La siguiente figura muestra el resultado de la aplicación:

image

Resumen

El soporte de Webcam y Micrófono en Silverlight 4 abre un mundo de posibilidades para crear aplicaciones que hagan uso de este tipo de dispositivos, además de tener un modelo de programación bastante sencillo.

Puedes descargar el código aquí

Puedes ver el demo en vivo aquí (requiere Silverlight 4)

Comments (3)

[...] Ve el artículo completo aquí [...]

muy buen aporte

lamentablemente el ejemplo no se lo puede ver por que es una ver. de prueba

a ver si lo actualizar para disfrutarlo

una pregunta, al respecto, junto con tener acceso a la webcam queria saver si saber como hacer traking de objetos con la webcam, escribeme si lo sabes, agradecere mucho tu ayuda

Hola Rodrigo! excelente articulo, me gustaria saber como hago para guardar una imagen en mi pc una vez capturada.

Gracias!

Write a comment

Spam Protection by WP-SpamFree