カメラ プロファイルを使用したカメラ機能の検出と選択Discover and select camera capabilities with camera profiles

この記事では、カメラ プロファイルを使ってさまざまなビデオ キャプチャ デバイスの機能を検出および管理する方法について説明します。This article discusses how to use camera profiles to discover and manage the capabilities of different video capture devices. これには、特定の解像度やフレーム レートをサポートするプロファイル、複数のカメラへの同時アクセスをサポートするプロファイル、HDR をサポートするプロファイルを選ぶなどのタスクが含まれます。This includes tasks such as selecting profiles that support specific resolutions or frame rates, profiles that support simultaneous access to multiple cameras, and profiles that support HDR.

注意

この記事の内容は、写真やビデオの基本的なキャプチャ機能を実装するための手順を紹介した「MediaCapture を使った基本的な写真、ビデオ、およびオーディオのキャプチャ」で取り上げた概念やコードに基づいています。This article builds on concepts and code discussed in Basic photo, video, and audio capture with MediaCapture, which describes the steps for implementing basic photo and video capture. そちらの記事で基本的なメディア キャプチャのパターンを把握してから、高度なキャプチャ シナリオに進むことをお勧めします。It is recommended that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. この記事で紹介しているコードは、MediaCapture のインスタンスが既に作成され、適切に初期化されていることを前提としています。The code in this article assumes that your app already has an instance of MediaCapture that has been properly initialized.

 

カメラ プロファイルについてAbout camera profiles

カメラが搭載されているデバイスによって、キャプチャ解像度、ビデオ キャプチャのフレーム レート、HDR または可変フレーム レート キャプチャなど、サポートされている機能も異なります。Cameras on different devices support different capabilities including the set of supported capture resolutions, frame rate for video captures, and whether HDR or variable frame rate captures are supported. ユニバーサル Windows プラットフォーム (UWP) メディア キャプチャ フレームワークでは、この機能セットが MediaCaptureVideoProfileMediaDescription に格納されます。The Universal Windows Platform (UWP) media capture framework stores this set of capabilities in a MediaCaptureVideoProfileMediaDescription. MediaCaptureVideoProfile オブジェクトで表されるカメラ プロファイルには、メディア記述のコレクションが 3 つ含まれています。1 つは写真のキャプチャ用、1 つはビデオ キャプチャ用、もう 1 つはビデオ プレビュー用です。A camera profile, represented by a MediaCaptureVideoProfile object, has three collections of media descriptions; one for photo capture, one for video capture, and another for video preview.

MediaCapture オブジェクトを初期化する前に、現在のデバイスのキャプチャ デバイスを照会して、サポートされているプロファイルを確認することができます。Before initializing your MediaCapture object, you can query the capture devices on the current device to see what profiles are supported. サポートされているプロファイルを選択すると、機能、プロファイルのメディア記述に含まれているすべての機能がすべてキャプチャ デバイスでサポートされることがわかります。When you select a supported profile, you know that the capture device supports all of the capabilities in the profile's media descriptions. これにより、特定のデバイスでどのような組み合わせの機能がサポートされているか確認するために試行錯誤する必要がなくなります。This eliminates the need for a trial and error approach to determining which combinations of capabilities are supported on a particular device.

var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };

この記事のコード例では、最小限の初期化が、さまざまな機能をサポートするカメラ プロファイルの検出に置き換わっています。検出されたプロファイルは、メディア キャプチャ デバイスの初期化に使用されます。The code examples in this article replace this minimal initialization with the discovery of camera profiles supporting various capabilities, which are then used to initialize the media capture device.

カメラ プロファイルをサポートするビデオ デバイスを検出するFind a video device that supports camera profiles

サポートされているカメラ プロファイルを検索する前に、カメラ プロファイルの使用がサポートされるキャプチャ デバイスを検出する必要があります。Before searching for supported camera profiles, you should find a capture device that supports the use of camera profiles. 次の例で定義されている GetVideoProfileSupportedDeviceIdAsync ヘルパー メソッドでは、DeviceInformaion.FindAllAsync メソッドを使って、すべての利用可能なビデオ キャプチャ デバイスの一覧を取得しています。The GetVideoProfileSupportedDeviceIdAsync helper method defined in the example below uses the DeviceInformaion.FindAllAsync method to retrieve a list of all available video capture devices. 個々のデバイスについて静的メソッド IsVideoProfileSupported を呼び出し、ビデオ プロファイルがサポートされるかどうかを確認する処理が、一覧内のすべてのデバイスに対してループで実行されます。It loops through all of the devices in the list, calling the static method, IsVideoProfileSupported, for each device to see if it supports video profiles. また、各デバイスの EnclosureLocation.Panel プロパティで、使用するカメラがデバイスの前面にあるか背面にあるかを指定することができます。Also, the EnclosureLocation.Panel property for each device, allowing you to specify wether you want a camera on the front or back of the device.

指定された面に、カメラ プロファイルをサポートするデバイスが見つかった場合は、デバイスの ID 文字列が含まれている Id 値が返されます。If a device that supports camera profiles is found on the specified panel, the Id value, containing the device's ID string, is returned.

public async Task<string> GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel panel)
{
    string deviceId = string.Empty;

    // Finds all video capture devices
    DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
    
    foreach (var device in devices)
    {
        // Check if the device on the requested panel supports Video Profile
        if (MediaCapture.IsVideoProfileSupported(device.Id) && device.EnclosureLocation.Panel == panel)
        {
            // We've located a device that supports Video Profiles on expected panel
            deviceId = device.Id;
            break;
        }
    }

    return deviceId;
}

GetVideoProfileSupportedDeviceIdAsync ヘルパー メソッドから返されたデバイス ID が null または空の文字列であれば、指定された面にはカメラ プロファイルをサポートするデバイスがありません。If the device ID returned from the GetVideoProfileSupportedDeviceIdAsync helper method is null or an empty string, there is no device on the specified panel that supports camera profiles. この場合は、プロファイルを使用せずにメディア キャプチャ デバイスを初期化する必要があります。In this case, you should initialize your media capture device without using profiles.

string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);

if (string.IsNullOrEmpty(videoDeviceId))
{
    // No devices on the specified panel support video profiles. .
    return;
}

サポートされている解像度とフレーム レートに基づいてプロファイルを選択するSelect a profile based on supported resolution and frame rate

特定の解像度やフレーム レートを確保できるなど、特定の機能が含まれたプロファイルを選択するには、先ほど定義したヘルパー メソッドをまず呼び出して、カメラ プロファイルの使用をサポートするキャプチャ デバイスの ID を取得する必要があります。To select a profile with particular capabilities, such as with the ability to achieve a particular resolution and frame rate, you should first call the helper method defined above to get the ID of a capture device that supports using camera profiles.

選択されたデバイス ID を渡して、新しい MediaCaptureInitializationSettings オブジェクトを作成します。Create a new MediaCaptureInitializationSettings object, passing in the selected device ID. 次に、静的メソッド MediaCapture.FindAllVideoProfiles を呼び出して、デバイスでサポートされているすべてのカメラ プロファイルの一覧を取得します。Next, call the static method MediaCapture.FindAllVideoProfiles to get a list of all camera profiles supported by the device.

この例では、System.Linq 名前空間に含まれている Linq クエリの手法を使用して、WidthHeightFrameRate の各プロパティが要求値に一致する SupportedRecordMediaDescription オブジェクトが含まれたプロパティを選択しています。This example uses a Linq query method, included in the using System.Linq namespace, to select a profile that contains a SupportedRecordMediaDescription object where the Width, Height, and FrameRate properties match the requested values. 一致が見つかった場合、MediaCaptureInitializationSettingsVideoProfileRecordMediaDescription が、Linq クエリから返された匿名型の値に設定されます。If a match is found, VideoProfile and RecordMediaDescription of the MediaCaptureInitializationSettings are set to the values from the anonymous type returned from the Linq query. 一致が見つからなかった場合は、既定のプロパティが使われます。If no match is found, the default profile is used.


var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = videoDeviceId };

IReadOnlyList<MediaCaptureVideoProfile> profiles = MediaCapture.FindAllVideoProfiles(videoDeviceId);

var match = (from profile in profiles
             from desc in profile.SupportedRecordMediaDescription
             where desc.Width == 640 && desc.Height == 480 && Math.Round(desc.FrameRate) == 30
             select new { profile, desc }).FirstOrDefault();

if (match != null)
{
    mediaInitSettings.VideoProfile = match.profile;
    mediaInitSettings.RecordMediaDescription = match.desc;
}
else
{
    // Could not locate a WVGA 30FPS profile, use default video recording profile
    mediaInitSettings.VideoProfile = profiles[0];
}

目的のカメラ プロファイルを MediaCaptureInitializationSettings に設定した後、メディア キャプチャ オブジェクトで InitializeAsync を呼び出して、目的のプロファイルに構成します。After you populate the MediaCaptureInitializationSettings with your desired camera profile, you simply call InitializeAsync on your media capture object to configure it to the desired profile.

await _mediaCapture.InitializeAsync(mediaInitSettings);

メディア フレーム ソース グループを使用してプロファイルを取得するUse media frame source groups to get profiles

Windows 10、バージョン 1803 以降では、MediaFrameSourceGroup クラスを使用して、特定の機能を備えたカメラ プロファイルを取得した後に、MediaCapture オブジェクトを初期化できます。Starting with Windows 10, version 1803, you can use the MediaFrameSourceGroup class to get camera profiles with specific capabilities before initializing the MediaCapture object. デバイス メーカーは、フレーム ソース グループを使用して、一連のセンサー機能やキャプチャ機能を 1 つの仮想デバイスとして表すことができます。Frame source groups allow device manufacturers to represent groups of sensors or capture capabilities as a single virtual device. これにより、深度とカラー カメラを組み合わせるなどのコンピュテーショナル フォトグラフィー (計算写真学) のシナリオが可能になるだけでなく、単純なキャプチャのシナリオでカメラ プロファイルを選択するためにも使用できます。This enables computational photography scenarios such as using depth and color cameras together, but can also be used to select camera profiles for simple capture scenarios. MediaFrameSourceGroup の使用方法について詳しくは、「MediaFrameReader を使ったメディア フレームの処理」をご覧ください。For more information on using MediaFrameSourceGroup, see Process media frames with MediaFrameReader.

次のサンプル メソッドでは、MediaFrameSourceGroup オブジェクトを使用して、既知のビデオ プロファイルをサポートしているカメラ プロファイル (HDR や可変の写真シーケンスをサポートするカメラ プロファイルなど) を検索する方法を示しています。The example method below shows how to use MediaFrameSourceGroup objects to find a camera profile that supports a known video profile, such as one that supports HDR or variable photo sequence. まず、MediaFrameSourceGroup.FindAllAsync を呼び出して、現在のデバイス上で利用可能なすべてのメディア フレーム ソース グループの一覧を取得します。First, call MediaFrameSourceGroup.FindAllAsync to get a list of all media frame source groups available on the current device. ループ処理によって各ソース グループで MediaCapture.FindKnownVideoProfiles を呼び出し、現在のソース グループについて、指定したプロファイル (この例では HDR/WCG 写真) をサポートしているすべてのビデオ プロファイルの一覧を取得します。Loop through each source group and call MediaCapture.FindKnownVideoProfiles to get a list of all of the video profiles for the current source group that support the specified profile, in this case HDR with WCG photo. 条件に適合するプロファイルが見つかった場合、新しい MediaCaptureInitializationSettings オブジェクトが作成され、VideoProfile が選択したプロファイルに設定されると共に、VideoDeviceId が現在のメディア フレーム ソース グループの Id プロパティに設定されます。If a profile that meets the criteria is found, create a new MediaCaptureInitializationSettings object and set the VideoProfile to the select profile and the VideoDeviceId to the Id property of the current media frame source group. これにより、たとえば KnownVideoProfile.HdrWithWcgVideo をこのメソッドに渡すと、HDR ビデオをサポートしているメディア キャプチャ設定を取得できます。So, for example, you could pass the value KnownVideoProfile.HdrWithWcgVideo into this method to get media capture settings that support HDR video. また KnownVideoProfile.VariablePhotoSequence を渡すと、加変の写真シーケンスをサポートしている設定を取得できます。Pass KnownVideoProfile.VariablePhotoSequence to get settings that support variable photo sequence.

private async Task<MediaCaptureInitializationSettings> GetKnownVideoProfile(KnownVideoProfile knownVideoProfile)
{
    IReadOnlyList<MediaFrameSourceGroup> sourceGroups = await MediaFrameSourceGroup.FindAllAsync();
    MediaCaptureInitializationSettings settings = null;

    foreach (MediaFrameSourceGroup sg in sourceGroups)
    {
        // Find a device that support VariablePhotoSequence
        IReadOnlyList<MediaCaptureVideoProfile> profileList = MediaCapture.FindKnownVideoProfiles(
                                      sg.Id,
                                      knownVideoProfile); // e.g. KnownVideoProfile.HdrWithWcgVideo

        if (profileList.Count > 0)
        {
            settings = new MediaCaptureInitializationSettings();
            settings.VideoProfile = profileList[0];
            settings.VideoDeviceId = sg.Id;
            break;
        }
    }
    return settings;

    
}

既知のプロファイルを使用して HDR ビデオをサポートするプロファイルを検出する (従来の手法)Use known profiles to find a profile that supports HDR video (legacy technique)

注意

このセクションで説明されている API は、Windows 10、バージョン 1803 以降では非推奨です。The APIs described in this section are deprecated starting with Windows 10, version 1803. 上記の「メディア フレーム ソース グループを使用してプロファイルを取得する」をご覧ください。See the previous section, Use media frame source groups to get profiles.

HDR をサポートするプロファイルの選択も、他のシナリオと同じように始まります。Selecting a profile that supports HDR begins like the other scenarios. 作成、 MediaCaptureInitializationSettingsとキャプチャ デバイス ID を格納する文字列Create a MediaCaptureInitializationSettings and a string to hold the capture device ID. HDR ビデオがサポートされているかどうかを追跡するためのブール変数を追加します。Add a boolean variable that will track whether HDR video is supported.

MediaCaptureInitializationSettings mediaInitSettings = new MediaCaptureInitializationSettings();
string videoDeviceId = string.Empty;
bool HdrVideoSupported = false;

上で定義した GetVideoProfileSupportedDeviceIdAsync ヘルパー メソッドを使って、カメラ プロファイルをサポートしているキャプチャ デバイスのデバイス ID を取得します。Use the GetVideoProfileSupportedDeviceIdAsync helper method defined above to get the device ID for a capture device that supports camera profiles.

// Select the first video capture device found on the back of the device
videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);

if (string.IsNullOrEmpty(videoDeviceId))
{
    // No devices on the specified panel support video profiles. .
    return;
}

静的メソッド MediaCapture.FindKnownVideoProfiles により、指定の KnownVideoProfile 値で分類された指定のデバイスでサポートされるカメラ プロファイルが返されます。The static method MediaCapture.FindKnownVideoProfiles returns the camera profiles supported by the specified device that is categorized by the specified KnownVideoProfile value. このシナリオでは、ビデオ録画をサポートするカメラ プロファイルのみが返されるように、VideoRecording 値が指定されています。For this scenario, the VideoRecording value is specified to limit the returned camera profiles to ones that support video recording.

返されたカメラ プロファイルの一覧をループ処理します。Loop through the returned list of camera profiles. 各カメラ プロファイルで、プロファイル内の各 VideoProfileMediaDescription をループ処理して、IsHdrVideoSupported プロパティの値が true かどうかをチェックします。For each camera profile, loop through each VideoProfileMediaDescription in the profile checking to see if the IsHdrVideoSupported property is true. 適切なメディア記述が見つかったら、ループを抜けて、プロファイルと記述のオブジェクトを MediaCaptureInitializationSettings オブジェクトに割り当てます。After a suitable media description is found, break out of the loop and assign the profile and description objects to the MediaCaptureInitializationSettings object.

IReadOnlyList<MediaCaptureVideoProfile> profiles =
    MediaCapture.FindKnownVideoProfiles(videoDeviceId, KnownVideoProfile.VideoRecording);

// Walk through available profiles, look for first profile with HDR supported Video Profile
foreach (MediaCaptureVideoProfile profile in profiles)
{
    IReadOnlyList<MediaCaptureVideoProfileMediaDescription> recordMediaDescription =
        profile.SupportedRecordMediaDescription;
    foreach (MediaCaptureVideoProfileMediaDescription videoProfileMediaDescription in recordMediaDescription)
    {
        if (videoProfileMediaDescription.IsHdrVideoSupported)
        {
            // We've located the profile and description for HDR Video, set profile and flag
            mediaInitSettings.VideoProfile = profile;
            mediaInitSettings.RecordMediaDescription = videoProfileMediaDescription;
            HdrVideoSupported = true;
            break;
        }
    }

    if (HdrVideoSupported)
    {
        // Profile with HDR support found. Stop looking.
        break;
    }
}

写真とビデオの同時キャプチャがデバイスでサポートされているかどうかを確認するDetermine if a device supports simultaneous photo and video capture

多くのデバイスでは、写真とビデオの同時キャプチャがサポートされます。Many devices support capturing photos and video simultaneously. キャプチャ デバイスでこの動作がサポートされているかどうかを確認するには、MediaCapture.FindAllVideoProfiles を呼び出して、デバイスでサポートされているすべてのカメラ プロファイルを取得します。To determine if a capture device supports this, call MediaCapture.FindAllVideoProfiles to get all of the camera profiles supported by the device. Linq クエリを使って、SupportedPhotoMediaDescriptionSupportedRecordMediaDescription に 1 つ以上のエントリがある (プロファイルで同時キャプチャがサポートされていることを意味する) プロファイルを検出します。Use a link query to find a profile that has at least one entry for both SupportedPhotoMediaDescription and SupportedRecordMediaDescription which means that the profile supports simultaneous capture.

var simultaneousPhotoAndVideoSupported = false;

IReadOnlyList<MediaCaptureVideoProfile> profiles = MediaCapture.FindAllVideoProfiles(videoDeviceId);

var match = (from profile in profiles
             where profile.SupportedPhotoMediaDescription.Any() &&
             profile.SupportedRecordMediaDescription.Any()
             select profile).FirstOrDefault();

if (match != null)
{
    // Simultaneous photo and video supported
    simultaneousPhotoAndVideoSupported = true;
}
else
{
    // Simultaneous photo and video not supported
    simultaneousPhotoAndVideoSupported = false;
}

このクエリを調整して、同時ビデオ録画以外にも、特定の解像度やその他の機能をサポートするプロファイルを検出することもできます。You can refine this query to look for profiles that support specific resolutions or other capabilities in addition to simultaneous video record. また、MediaCapture.FindKnownVideoProfiles を使って BalancedVideoAndPhoto 値を指定し、同時キャプチャをサポートするプロファイルを取得することもできますが、すべてのプロファイルを照会する方が完全な結果を得ることができます。You can also use the MediaCapture.FindKnownVideoProfiles and specify the BalancedVideoAndPhoto value to retrieve profiles that support simultaneous capture, but querying all profiles will provide more complete results.