Silverlight: gestione della Webcam

Articolo introduttivo alla gestione della webcam e audio con Silverlight.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Con la versione 4 di Silverlight, sono state inserite nuove classi, che permettono un utilizzo ancora più professionale della tecnologia Silvierlight. Tra le numerose novità troviamo la gestione della webcam e dell’audio.
In questo articolo, si forniscono le basi di utilizzo della webcam.

Creazione del progetto

Si crea un nuovo progetto in Silverlight secondo il linguaggio di programmazione di vostro gradimento.
Dopo aver creato il progetto, inserite nella pagina due controlli combobox, che avranno il compito di visualizzare l’elenco delle webcam installate nel pc e dell’audio.
Inserite un controllo Rectable, e tre controlli di tipo pulsante il tutto come mostrato in figura 1.




Figura 1 – La finestra con i controlli

Ora non ci resta che creare le classi per visualizzare la ripresa della webcam.
Passiamo in visualizzazione codice e dichiariamo a livello di classe, sotto la dichiarazione della classe, gli oggetti CaptureSource e ImageBrusce

Qui di seguito si riporta il frammento di codice per entrambi i linguaggi. 


VB.Net
  Dim CaSourceCattura As New CaptureSource()
  Dim imageBrush = New ImageBrush()
C#
 CaptureSource CaSourceCattura = new CaptureSource();
        ImageBrush imageBrush = new ImageBrush();
        VideoCaptureDevice webcam = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
        AudioCaptureDevice audio = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();



Nell’evento loadContent della pagina, scriviamo il codice per il caricamento delle combo per la visualizzazione dei nomi delle webcam installate e nomi delle periferiche audio installate.
Qui di seguito si riporta il frammento di codice.


VB.Net
Private Sub LayoutRoot_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles LayoutRoot.Loaded
        CmbMicrofono.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices()
        CmbCam.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices()
    End Sub
C#
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
        {
            CmbMicrofono.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices();
            CmbCam.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices();
        }


La classe CaptureDeviceConfiguration, tramite il metodo GetAvailableAudioCaptureDevices elenca tutte le periferiche audio e video installate nel pc.
Nell’evento click del pulsante con la dicitura “Avvia” (o uno dei pulsanti sulla form) dobbiamo eseguire il codice per eseguire la ripresa della webcam.
Qui di seguito, si riporta il codice per il linguaggio di programmazione VB.Net e C# che permette di avviare la ripresa della webcam.

 VB.Net
Private Sub BtnAvvia_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles BtnAvvia.Click
        Dim webcam = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice()
        Dim audio = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice()
        CaSourceCattura.VideoCaptureDevice = webcam
        CaSourceCattura.AudioCaptureDevice = audio
        Dim webcamBrush = New VideoBrush()
        webcamBrush.SetSource(CaSourceCattura)
        RctVisualizzaCam.Fill = webcamBrush
        If CaptureDeviceConfiguration.RequestDeviceAccess AndAlso (CaSourceCattura.VideoCaptureDevice IsNot Nothing) Then
            Try
                CaSourceCattura.Start()
            Catch ex As InvalidOperationException
                ' Errore
                MessageBox.Show("Impossibile accedere alla webCam")
            End Try
        End If
    End Sub
C#
private void BtnAvvia_Click(object sender, RoutedEventArgs e)
        {
            CaSourceCattura.VideoCaptureDevice = webcam;
            CaSourceCattura.AudioCaptureDevice = audio;
            VideoBrush webcamBrush = new VideoBrush();
            webcamBrush.SetSource(CaSourceCattura);
            RctVisualizzaCam.Fill = webcamBrush;
            if (CaptureDeviceConfiguration.RequestDeviceAccess() && CaSourceCattura.VideoCaptureDevice != null)
            {
                try
                {
                    CaSourceCattura.Start();
                }
                catch (InvalidOperationException ex)
                {
                    MessageBox.Show("Impossibile accedere alla webCam");
                }
            }
        }

Come si è visto dal frammento di codice precedente, dopo aver assegnato alla proprietà VideoCaptureDevice ed AudioCaptureDevice, gli oggetti per la gestione webcam e audio, si verifica se è accessibile, a questo punto, tramite il metodo Start si avvia la ripresa, che verrà visualizzata nel controllo rettangolo.

Tramite il metodo “Stop” della classe “CaptureSource”si ferma la ripresa, qui di seguito un frammento di codice dell’evento click del pulsante per fermare la ripresa.

VB.Net
  Private Sub BtnFerma_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles BtnFerma.Click
        If (CaSourceCattura.VideoCaptureDevice IsNot Nothing) Then
            CaSourceCattura.Stop()
        End If
    End Sub
C#
  private void BtnFerma_Click(object sender, RoutedEventArgs e)
        {
            if (CaSourceCattura.VideoCaptureDevice != null)
            {
                CaSourceCattura.Stop();
            }
        }
 

A questo punto non ci rimane che scrivere il codice, per utilizzare la webcam per rilevare i singoli frame, ossia immagini dalla nostra webcam.
Nell’evento click inseriamo il codice per tale operazione. Mentre i frammenti di codice seguenti, illustrano vari aspetti, come la gestione in caso di errore, quando ha completato il rilevamento delle immagini, e tanto altro.

 

VB.Net
Private Sub BtnRilevaImmagine_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles BtnRilevaImmagine.Click
        ' Rilevo l'immagine
        RctVisualizzaCam.Fill = imageBrush
        If CaptureDeviceConfiguration.RequestDeviceAccess AndAlso (CaSourceCattura.VideoCaptureDevice IsNot Nothing) Then
            CaSourceCattura.Start()
            If (CaSourceCattura.VideoCaptureDevice IsNot Nothing) _
            AndAlso (CaSourceCattura.State = CaptureState.Started) Then
                CaSourceCattura.CaptureImageAsync()
            End If
        End If
        AddHandler CaSourceCattura.CaptureImageCompleted, AddressOf CaSourceCattura_CaptureImageCompleted
        AddHandler CaSourceCattura.CaptureFailed, AddressOf CaSourceCattura_CaptureFailed
    End Sub

Gestore di evento CaptureImageCompletend

Private Sub CaSourceCattura_CaptureImageCompleted(ByVal sender As Object, ByVal e As CaptureImageCompletedEventArgs)
        imageBrush.ImageSource = e.Result
    End Sub

Gestore di evento in caso di fallimento

  Private Sub CaSourceCattura_CaptureFailed(ByVal sender As Object, ByVal e As ExceptionRoutedEventArgs)
        'Gestione errore
    End Sub
C#
private void BtnRilevaImmagine_Click(object sender, RoutedEventArgs e)
        {
            //Rilevo l'immagine
            RctVisualizzaCam.Fill = imageBrush;
            if (CaptureDeviceConfiguration.RequestDeviceAccess() && CaSourceCattura.VideoCaptureDevice != null)
            {
                CaSourceCattura.Start();
                if (CaSourceCattura.VideoCaptureDevice != null && CaSourceCattura.State == CaptureState.Started)
                {
                    CaSourceCattura.CaptureImageAsync();
                }
            }
            CaSourceCattura.CaptureImageCompleted += new EventHandler<CaptureImageCompletedEventArgs>(CaSourceCattura_CaptureImageCompleted);
            CaSourceCattura.CaptureFailed += new EventHandler<ExceptionRoutedEventArgs>(CaSourceCattura_CaptureFailed);
        }

Gestore di evento in caso di completamento positivo

void CaSourceCattura_CaptureImageCompleted(object sender, CaptureImageCompletedEventArgs e)
        {
            imageBrush.ImageSource = e.Result;
        }

Gestore di evento in caso di fallimento

void CaSourceCattura_CaptureFailed(object sender, ExceptionRoutedEventArgs e)
        {
            //Gestione errore
        }

A questo punto non ci resta che testare il nostro applicativo, avviamo il programma e facciamo le prove.

Conclusioni

L’articolo ha voluto fornire le basi per utilizzare la webcam e l’audio nelle applicazioni Silverlight versione 4 o successiva, tramite il linguaggio di programmazione VB.Net e C#.
Le varie classi messe a disposizione offrono al programmatore interessanti possibilità di realizzare applicazioni avanzate.