Silverlight 4 Webcam API.

20. Dezember 2009

Ich hab mir jetzt endlich eine WebCam gekauft, um mich ein wenig in die neue WebCam API einzuarbeiten. Wie schon in einem älteren Beitrag beschrieben ist das Ganze relativ einfach. Auf User Interaktion warten, Rechte anfordern und die Webcam läuft.

Das Ganze sieht im dann etwa so aus:

[csharp]
private void Button_Click(object sender, RoutedEventArgs e)
{
   // Init capture devices
   var source= new CaptureSource();
   source.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
   source.AudioCaptureDevice = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();

   // Ask user for permission
   if (CaptureDeviceConfiguration.AllowedDeviceAccess
   || CaptureDeviceConfiguration.RequestDeviceAccess())
   {
     if (source.State == CaptureState.Started)
     {
        return;
     }

     // Create video brush that preserves the aspect
     // ratio and fill a Rectangle with it
     var videoBrush = new VideoBrush();
     videoBrush.Stretch = Stretch.None;
     videoBrush.SetSource(source);
     Display.Fill = videoBrush;
     source.Start();
   }
}
[/csharp]

Und das ist es dann schon eigentlich.

Naja… noch nicht ganz. VideoCaptureDevice besitzt zwei interessante Properties. SupportedFormats und DesiredFormat. SupportedFormates enthält eine Liste an Objekten vom Type VideoFormat. VideoFormat enthält Informationen zur Höhe, Breite, Framerate, dem Pixel-Format und eine Schritt Angabe für die Breite einer Zeile in Byte.

Interessant ist, dass ich zur Zeit nur Unknown für das Pixel-Format erhalte. Entweder unterstütz meine Webcam keine 32-Bit Farbinformationen oder das ist ein Bug.

Mit Hilfe von DesiredFormat kann man ein VideoFormat setzen und damit bestimmen, in welcher Auflösung und Framerate man das Bild abgreifen möchte. Ach ohne User Interaktion kann man auf beide Eigenschaften zugreifen und somit die Auflösung setzen. Leider funktioniert dies nicht, während die Webcam schon gestartet wurde. Erst nach dem Stoppen der Webcam kann die Auflösung erneut geändert werden.