Windows 8.1 ストアアプリで、USBで接続されたWebカメラやマイクと連携する

USBで接続したWebカメラから画像を取り込みたい場合もありますよね。最近のNote PCやタブレットではカメラがほぼデフォルトでついていますが、デスクトップやちょっと前のNote PCだとついていないので、WebカメラをUSBでつなぐシーンはよくある事と思います。

最近、BluetoothやUSBで接続する機器との連携方法を解説していますが、プログラムの流れはほぼ同じで、Visual(カメラ)デバイスやAudio(マイク)デバイスを列挙して接続、MediaElementやCaptureElementで利用、という流れになります。

先ず、デバイスの列挙ですが、

    var devInfoCollection = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
    DeviceInformation cameraDI=null;
    foreach (var devInfo in devInfoCollection)
    {
        if (devInfo.Name == "Camera Device Name")
        {
            cameraDI = devInfo;
            break;
        }
    }

Windows.Devices.Enumelation名前空間のDeviceClassの列挙子を使って、FindAllAsync()で列挙します。DeviceClassにはAudioなど幾つか種類が用意されているので、列挙したいものを指定してください。Camera Device Nameは、つないでいるWebカメラの名前です。
コントロールパネルのデバイスマネージャーで確認しましょう。実はこのデバイスの列挙で、Note PCやタブレットに装備されているカメラも取り出すことができます。XAMLでUIを定義していて、任意の場所に画像を取り込みたい場合にもこの記事は活用可能です。

Webカメラからの画像は、MediaCaptureクラスを使って取り出し、CaptureElementクラスを使ってUI上に表示します。

    var mediaCapture = new Windows.Media.Capture.MediaCapture();
    var settings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
    settings.VideoDeviceId = cameraDI.Id;

    devInfoCollection = await DeviceInformation.FindAllAsync(DeviceClass.AudioCapture);
    var audioDevice = devInfoCollection[0];
    settings.AudioDeviceId = audioDevice.Id;

    await mediaCapture.InitializeAsync(settings);

MediaCaptureInitializationSettingsクラスのオブジェクトを作り、Videoその他を設定し、MediaCaptureオブジェクトを初期化するという流れになります。上のコードでは、Videoデバイスだけでなく、Audioデバイスも同時に指定しています。
上のコードでは、DeviceClass.AudioCaptureを使って、FindAllAsync()で取敢えず一つデバイスを選択していますが、特定のデバイスを使いたい場合は、Webカメラの時と同じようにデバイスの名前等で適切なものを選択してください。

MediaCaptureオブジェクトの設定が終わったら、静止画の場合はMediaElement、動画の場合は、CaptureElementを使ってUI表示を行います。

    ceCamera.Source = mediaCapture;
    await mediaCapture.StartPreviewAsync();

ceCameraは、XAML上でページに配置されたUIコントロールです。
以上で、UI上で指定したWebカメラからの画像が表示されだします。

ただし、カメラやマイクを使うことになるので、Package.appxmanifestの機能宣言でカメラとマイクにチェックを入れることをお忘れなきよう。

公式のサンプルも公開されているので、そちらもご参照くださいまし。 https://code.msdn.microsoft.com/windowsapps/Media-Capture-Sample-adf87622