1.デバイスへのアクセス許可を調査する
カメラやマイクなどのデバイスは、Silverlightを動作させるコンピュータに存在するデバイスです。このため、Silverlightからカメラやマイクのデバイスを操作する場合は、必ずユーザーの許可を得る必要があります。
RequestDeviceAccessメソッドを呼び出すと、図3のようなダイアログが表示され、そのサイトからデバイスに対してアクセスを試みようとしていることを、ユーザーに通知します。
注意点として、このメソッドは、ユーザーがイベントの主導となるボタンクリックのイベントなどから呼び出す必要があります。ページの初期化イベントなど、ユーザーが意図しないイベントから呼び出された場合は、必ずfalseが返されます。また、後述するCaptureSourceのインスタンスが既に作成されている場合も、同様にfalseが返されます。
この状態でキャプチャーを開始すると、InvalidOperationExceptionが発生します。
図3のダイアログでは、そのサイトに対して今後ユーザーの許可が必要ない場合は、[回答を保存する]チェックボックスをONにすることで、そのサイトへのデバイスの許可を保存できます。
ユーザーが既にそのサイトでデバイスに対するアクセスを許可しているかどうかは、AllowedDeviceAccessプロパティを調べれば分かります。また、今までに許可したサイトの一覧は、Silverlightのプロパティ画面にある[アクセス許可]から確認と編集ができます(図4を参照)。
2.デバイスを操作するためのCaptureSourceを作成する
利用可能なデバイスの一覧を取得したり、デフォルトのデバイスを取得する場合にも、CaptureDeviceConfigurationクラスを利用できます。2ではデフォルトのビデオデバイスとオーディオデバイスを取得し、実際にデバイスを操作するためにCaptureSourceクラスのプロパティに割り当てています(デバイスの一覧を取得したい場合は、GetAvailableAudioCaptureDevicesメソッドから現在有効なデバイスの一覧を取得することが可能です)。
どのデバイスをデフォルトのデバイスとして設定するかは、図5のSilverlightのプロパティ画面で操作できます。利用できるデバイスが存在しない場合は、そのデバイスはnullになるので、デバイスからデータを取得する場合はデバイスのインスタンスが取得できたかを調べる必要があります。また、ここで設定したデバイスがキャプチャーを開始する(Startメソッドの呼び出し時)までにプログラムで利用可能になっていない場合は、StartメソッドでArgumentExceptionが発生します。
3.ビデオブラシを作成し、動画を表示する
デバイスで取得した動画をSilverlightのページ上に表示するには、VideoBrushクラス経由でSilverlightのエレメントに表示するのが最も簡単な方法です。3では、リスト1で定義したwebCamDisplayという名前の四角形にキャプチャーした動画を表示しています。
もちろんBrushを設定するだけなので、ボタンやテキストボックスなどのSilverlightのほかのエレメントにキャプチャー動画を表示することも可能です。
4.ビデオの開始と停止
この説明は必要ないと思いますが、CaptureSourceのインスタンスに関連付けしたデバイスは、Startで開始してStopで停止できます。開始したビデオは忘れずに停止しましょう。
ここまでで、カメラから取得した動画をSilverlight上で表示できるようになりました。早速、Visual Studioからデバッグを行って動作を確認してみてください。許可を促すダイアログが表示された後に、キャプチャーが開始されたことを確認できたでしょうか。
キャプチャー画像の表示
再生中のビデオデバイスからキャプチャーを取得するには、CaptureImageAsyncメソッドを利用します。キャプチャーが取得できた場合にはCaptureImageCompletedイベントが呼び出されるので、Resultプロパティからイメージデータを取得します(リスト3を参照)。
private void btnStart_Click(object sender, RoutedEventArgs e) { ... 略 ... // 画像キャプチャーの設定 captureImages.Items.Clear(); _captureSource.CaptureImageCompleted += (_s, _e) => { captureImages.Items.Add(new Image() { Source = _e.Result, }); }; ... 略 ... _captureSource.Start(); } // チャプターボタンクリック時のイベントハンドラー private void btnCapture_Click(object sender, RoutedEventArgs e) { if (_captureSource == null || _captureSource.State != CaptureState.Started) { return; } _captureSource.CaptureImageAsync(); }
ここで注意する点は、キャプチャーが停止しているとチャプターを取ることはできないので、チャプター取得時にはキャプチャーが開始されているかを調べる必要があることです。キャプチャーの現在の状況を調べるには、CaptureSourceクラスのStateプロパティを調査します。キャプチャーが開始されていない状態でCaptureImageAsyncメソッドを呼び出すと、InvalidOperationExceptionが発生します。
キャプチャーを開始中にチャプターボタンをクリックすると、ボタンの下にチャプターした画像が追加されていくのが確認できるはずです。チャプターした画像は、連載「Silverlight 3で強化されたグラフィックとメディア機能」のWritableBitmapの項で紹介している方法でファイルとして保存できます。