Silverlight 4 - 摄像头支持






4.80/5 (4投票s)
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
属性设置为此画笔。
简单的应用程序
现在我们将编写一个非常简单的应用程序
- 创建一个 Silverlight 应用程序并打开 MainPage.xaml。
- 添加一个矩形(用于显示目的)和两个按钮(开始和停止)
<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>
- 代码如下
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(); } } }