カメラ

Silverlight 4 からはカメラ・マイクを使えるようになったとさ。ってことで早速。

<Grid x:Name="LayoutRoot" Background="White">
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition />
    <ColumnDefinition Width="Auto" />
  </Grid.ColumnDefinitions>
  <Button Content="キャプチャー" Click="Button_Click" />
  <Rectangle Grid.Row="1" x:Name="VideoField">
    <Rectangle.Projection>
      <PlaneProjection 
        RotationX="{Binding ElementName=xSlider,Path=Value}"
        RotationY="{Binding ElementName=ySlider,Path=Value}" />
    </Rectangle.Projection>
  </Rectangle>
  <Slider Orientation="Vertical" Minimum="-180" Maximum="180"
    Value="0" Grid.Row="1" Grid.Column="1" x:Name="xSlider" />
  <Slider Orientation="Horizontal" Minimum="-180" Maximum="180"
    Value="0" Grid.Row="2" Grid.Column="0" x:Name="ySlider"/>
</Grid>
private void Button_Click(object sender, RoutedEventArgs e) {
  if (!CaptureDeviceConfiguration.AllowedDeviceAccess) {
    if (!CaptureDeviceConfiguration.RequestDeviceAccess()) {
      return;
    }
  }
  StartCapture();
}

private void StartCapture() {
  CaptureSource source = new CaptureSource();
  source.VideoCaptureDevice = 
    CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
  VideoBrush video = new VideoBrush();
  video.SetSource(source);
  VideoField.Fill = video;
  try {
    source.Start();
  } catch (InvalidOperationException) {
    MessageBox.Show("キャプチャーを開始できませんでした。");
  }
}

どうもクリックイベントとかユーザー操作からしかキャプチャーを開始できないっぽいです。Loading イベントで CaptureDeviceConfiguration.RequestDeviceAccess メソッドを呼んでもダイアログがあがらずに false が返って動きませんでした。
この動き微妙やなぁ〜。


あと、カメラが既に動いていたら InvalidOperationException が発生しました。Start メソッドを呼ぶ前に動いてるかどうか確認する手段は無いのかしら。


いやー、しかしこれで色々楽しいことができそうですね。