リモート カメラへの接続します。Connect to remote cameras

この記事では、1 つまたは複数のリモート カメラに接続し、取得する方法を示します、 MediaFrameSourceGroup 各カメラからフレームを読み取ることができるようにするオブジェクト。This article shows you how to connect to one or more remote cameras and get a MediaFrameSourceGroup object that allows you to read frames from each camera. メディア ソースからのフレームの読み取りの詳細については、次を参照してください。 MediaFrameReader でメディア フレーム処理します。For more information on reading frames from a media source, see Process media frames with MediaFrameReader. デバイスとペアリングの詳細については、次を参照してください。デバイスをペアリングします。For more information on pairing with devices, see Pair devices.

注意

この記事で説明した機能は、Windows 10、バージョンが 1903 以降で使用できるのみです。The features discussed in this article are only available starting with Windows 10, version 1903.

使用可能なリモート カメラを監視する DeviceWatcher クラスを作成します。Create a DeviceWatcher class to watch for available remote cameras

DeviceWatcher クラスは、アプリに使用できるデバイスを監視し、デバイスの追加または削除されたときに、アプリに通知します。The DeviceWatcher class monitors the devices available to your app and notifies your app when devices are added or removed. インスタンスを取得DeviceWatcher呼び出して DeviceInformation.CreateWatcherの種類を識別する高度なクエリ構文 (AQS) 文字列を渡して、デバイスを監視します。Get an instance of DeviceWatcher by calling DeviceInformation.CreateWatcher, passing in an Advanced Query Syntax (AQS) string that identifies the type of devices you want to monitor. カメラのネットワーク デバイスを指定する AQS 文字列次に示します。The AQS string specifying network camera devices is the following:

@"System.Devices.InterfaceClassGuid:=""{B8238652-B500-41EB-B4F3-4234F7F5AE99}"" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True"

注意

ヘルパー メソッド MediaFrameSourceGroup.GetDeviceSelector がローカルに接続されていると、リモートのネットワーク カメラを監視する AQS の文字列を返します。The helper method MediaFrameSourceGroup.GetDeviceSelector returns an AQS string that will monitor locally-connected and remote network cameras. ネットワーク カメラのみを監視するには、前に示した AQS 文字列を使用する必要があります。To monitor only network cameras, you should use the AQS string shown above.

返される開始するとDeviceWatcher呼び出すことによって、 開始発生は、メソッド、 Added イベントが現在使用できるすべてのネットワーク カメラをします。When you start the returned DeviceWatcher by calling the Start method, it will raise the Added event for every network camera that is currently available. 呼び出すことによって、監視を停止するまで停止Addedカメラの新しいネットワーク デバイスが利用可能になるときに、イベントが発生しますが、 から削除されたカメラ デバイスが使用できなくなったときにイベントが発生します。Until you stop the watcher by calling Stop, the Added event will be raised when new network camera devices become available and the Removed event will be raised when a camera device becomes unavailable.

渡されるイベント引数、 Addedから削除されたイベント ハンドラーは、 DeviceInformation または DeviceInformationUpdate オブジェクトに、それぞれします。The event args passed into the Added and Removed event handlers are a DeviceInformation or a DeviceInformationUpdate object, respectively. これらの各オブジェクト、 Idプロパティ、イベントが発生した対象のネットワーク カメラの識別子です。Each of these objects has an Id property that is the identifier for the network camera for which the event was fired. この ID に渡す、 MediaFrameSourceGroup.FromIdAsync を取得するメソッド、 MediaFrameSourceGroup に使用できるオブジェクトカメラからフレームを取得します。Pass this ID into the MediaFrameSourceGroup.FromIdAsync method to get a MediaFrameSourceGroup object that you can use to retrieve frames from the camera.

リモート カメラ ペアリング ヘルパー クラスRemote camera pairing helper class

次の例を使用するヘルパー クラスを示しています、 DeviceWatcher作成、更新、 ObservableCollectionMediaFrameSourceGroupをサポートするオブジェクトカメラの一覧へのデータ バインディング。The following example shows a helper class that uses a DeviceWatcher to create and update an ObservableCollection of MediaFrameSourceGroup objects to support data binding to the list of cameras. 標準的なアプリをラップは、 MediaFrameSourceGroupカスタム モデル クラス。Typical apps would wrap the MediaFrameSourceGroup in a custom model class. ヘルパー クラスが、アプリへの参照を管理していることに注意してください CoreDispatcher カメラへの呼び出し内のコレクションを更新および RunAsync UI スレッドでコレクションにバインドされている UI が更新されるようにします。Note that the helper class maintains a reference to the app's CoreDispatcher and updates the collection of cameras within calls to RunAsync to ensure that the UI bound to the collection is updated on the UI thread.

また、この例では処理、 DeviceWatcher.Updated イベントに加え、 Addedから削除されたイベント。Also, this example handles the DeviceWatcher.Updated event in addition to the Added and Removed events. Updatedハンドラー、関連付けられているリモート カメラ デバイスから削除され、再びコレクションに追加されます。In the Updated handler, the associated remote camera device is removed from and then added back to the collection.

class RemoteCameraPairingHelper : IDisposable
{
    private CoreDispatcher _dispatcher;
    private DeviceWatcher _watcher;
    private ObservableCollection<MediaFrameSourceGroup> _remoteCameraCollection;
    public RemoteCameraPairingHelper(CoreDispatcher uiDispatcher)
    {
        _dispatcher = uiDispatcher;
        _remoteCameraCollection = new ObservableCollection<MediaFrameSourceGroup>();
        var remoteCameraAqs = @"System.Devices.InterfaceClassGuid:=""{B8238652-B500-41EB-B4F3-4234F7F5AE99}"" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True";
        _watcher = DeviceInformation.CreateWatcher(remoteCameraAqs);
        _watcher.Added += Watcher_Added;
        _watcher.Removed += Watcher_Removed;
        _watcher.Updated += Watcher_Updated;
        _watcher.Start();
    }
    public void Dispose()
    {
        _watcher.Stop();
        _watcher.Updated -= Watcher_Updated;
        _watcher.Removed -= Watcher_Removed;
        _watcher.Added -= Watcher_Added;
    }
    public IReadOnlyList<MediaFrameSourceGroup> FrameSourceGroups
    {
        get { return _remoteCameraCollection; }
    }
    private async void Watcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args)
    {
        await RemoveDevice(args.Id);
        await AddDeviceAsync(args.Id);
    }
    private async void Watcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args)
    {
        await RemoveDevice(args.Id);
    }
    private async void Watcher_Added(DeviceWatcher sender, DeviceInformation args)
    {
        await AddDeviceAsync(args.Id);
    }
    private async Task AddDeviceAsync(string id)
    {
        var group = await MediaFrameSourceGroup.FromIdAsync(id);
        if (group != null)
        {
            await _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                _remoteCameraCollection.Add(group);
            });
        }
    }
    private async Task RemoveDevice(string id)
    {
        await _dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            var existing = _remoteCameraCollection.FirstOrDefault(item => item.Id == id);
            if (existing != null)
            {
                _remoteCameraCollection.Remove(existing);
            }
        });
    }