65.9K
CodeProject 正在变化。 阅读更多。
Home

Silverlight 4 - 摄像头支持

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (4投票s)

2010年5月17日

CPOL

2分钟阅读

viewsIcon

18396

Silverlight 4 中的摄像头支持

Silverlight 4 不仅更加成熟,而且还具备丰富的功能。其中大部分功能都是 Silverlight 社区的建议。

摄像头支持就是其中之一。这是用户强烈要求的功能,现在已包含在此版本中。

以下步骤将帮助你开始初步的尝试

步骤 1

第一步是获取系统上所有可用的捕获设备(摄像头、麦克风等)或默认捕获设备。因此,CaptureDeviceConfiguration 类可以帮助我们获取有关所有可用设备的信息。这个辅助类公开了许多 static 成员来实现此目的。

  • CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices()
    它返回系统上的视频设备集合。
  • CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices()
    所有音频设备。
  • CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice()
    默认音频设备。
  • CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice()
    默认视频设备。

所以,在第一步之后,我们获得了设备

第二步

在与设备进行任何交互之前,Silverlight 应用程序需要从用户处获得权限(用户必须在安全提示中授予权限,从而确保调用是安全的)。

  • CaptureDeviceConfiguration.RequestDeviceAccess():要请求访问权限,请在用户发起的事件(如 listbox 项选择、按钮单击等)响应中调用此 static 方法。如果你的应用程序在没有用户交互的情况下自动执行此调用(例如,Load 事件),该方法将返回 false,并且应用程序的进一步操作将引发 InvalidOperationException

好的,应用程序获得了权限。让我们继续下一步。

步骤 3

现在我们有了权限和设备。是时候使用 CaptureSource 类与设备交互了。这个类允许你从摄像头收集视频流。要实现这一点,创建一个 CaptureSource 对象,并将 VideoCaptureDevice 设置为选定的设备。借助 CaptureSource,应用程序现在能够对设备执行以下任务。

  • Start
  • 停止
  • 设备状态
  • 捕获单个视频帧

步骤 4

现在创建一个视频画笔。VideoBrush 使我们能够使用视频内容绘制任何区域或控件。在此阶段,我们使用 CaptureSource 作为画笔的源。

步骤 5

接下来,我们需要调用 CaptureSource.Start() 方法来开始捕获实时视频。

步骤 6

最后,我们将 Rectangle 对象的 Fill 属性设置为此画笔。

简单的应用程序

现在我们将编写一个非常简单的应用程序

  1. 创建一个 Silverlight 应用程序并打开 MainPage.xaml
  2. 添加一个矩形(用于显示目的)和两个按钮(开始和停止)
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel Name="mainStackpanel">
            <Rectangle Height="256" Name="myDisplay" Stroke="Black" 
                StrokeThickness="1" Width="584" />
            <StackPanel Name="subStackpanel" Orientation="Horizontal"
                HorizontalAlignment="Center">
                <Button x:Name="butStart" Content="Start" Click="butStart_Click"/>
                <Button x:Name="butStop" Content="Stop" Click="butStop_Click" />
            </StackPanel>
        </StackPanel>
    </Grid>
  3. 代码如下
      public partial class MainPage : UserControl
        {
            CaptureSource captureSourec;
     
            public MainPage()
            {
                InitializeComponent(); 
            }
     
            private void butStart_Click(object sender, RoutedEventArgs e)
            {
                //Get the default video device
                VideoCaptureDevice myWebcam = 
                    CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
                
                //Grant permission 
                if (CaptureDeviceConfiguration.AllowedDeviceAccess ||
                    CaptureDeviceConfiguration.RequestDeviceAccess())
                {                
                    captureSourec = new CaptureSource();
                    captureSourec.VideoCaptureDevice  = myWebcam;
                    
                    //Create video brush that will get feed from captureSourec
                    VideoBrush myBrush = new VideoBrush();
                    myBrush.SetSource(captureSourec);
                    myBrush.Stretch = Stretch.UniformToFill;
     
     
                    //Stat the web cam
                    captureSourec.Start();
     
                    //Now display through the Rectangle
                    myDisplay.Fill = myBrush;  
                }
            } 
     
            private void butStop_Click(object sender, RoutedEventArgs e)
            {
                if (captureSourec != null)
                {
                    captureSourec.Stop();
                }
            }
        }
© . All rights reserved.