다음을 통해 공유


WinUI 앱에서 카메라 프로필을 사용하여 카메라 기능 검색 및 선택

이 문서에서는 카메라 프로필을 사용하여 다양한 비디오 캡처 디바이스의 기능을 검색하고 관리하는 방법을 보여 줍니다. 여기에는 특정 해상도 또는 프레임 속도를 지원하는 프로필 선택, 여러 카메라에 대한 동시 액세스를 지원하는 프로필 및 HDR을 지원하는 프로필과 같은 작업이 포함됩니다.

카메라 프로필에 대한 정보

다른 디바이스의 카메라는 지원되는 캡처 해상도 집합, 비디오 캡처의 프레임 속도, HDR 또는 가변 프레임 속도 캡처가 지원되는지 여부를 포함하여 다양한 기능을 지원합니다. 지원되는 기능 집합은 MediaCaptureVideoProfileMediaDescription 개체에 정의됩니다. MediaCaptureVideoProfile 개체로 표현되는 카메라 프로필에는 세 가지 미디어 설명 컬렉션이 있습니다. 하나는 사진 캡처용이고, 다른 하나는 비디오 캡처용이고, 다른 하나는 비디오 미리 보기용입니다.

MediaCapture 개체를 초기화하기 전에 현재 디바이스에서 캡처 디바이스를 쿼리하여 지원되는 프로필을 확인할 수 있습니다. 지원되는 프로필을 선택하면 캡처 디바이스가 프로필의 미디어 설명에 있는 모든 기능을 지원한다는 것을 알 수 있습니다. 이렇게 하면 특정 디바이스에서 지원되는 기능 조합을 결정하는 시행착오 접근 방식이 필요하지 않습니다.

카메라 프로필을 지원하는 카메라 찾기

카메라 프로필을 사용하려면 먼저 카메라 프로필 사용을 지원하는 카메라 디바이스를 확인해야 합니다. 아래 예제에서는 DeviceInformation.FindAllAsync 메서드를 사용하여 현재 디바이스의 전면 또는 후면 패널에서 사용 가능한 모든 비디오 캡처 디바이스 목록을 검색하는 방법을 보여줍니다. 각 디바이스가 비디오 프로필을 지원하는지 확인하기 위해 정적 메서드 인 IsVideoProfileSupported를 호출하여 목록의 모든 디바이스를 반복합니다.

카메라 프로필을 지원하는 디바이스가 지정된 패널에 있으면 디바이스의 ID 문자열을 포함하는 ID 값이 반환됩니다.

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이거나 빈 문자열인 경우 지정된 패널에 카메라 프로필을 지원하는 디바이스가 없습니다. 이 경우 프로필을 사용하지 않고 미디어 캡처 디바이스를 초기화해야 합니다.

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

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

지원되는 해상도 및 프레임 속도에 따라 프로필 선택

특정 해상도 및 프레임 속도를 달성하는 기능과 같은 특정 기능이 있는 프로필을 선택하려면 이 문서의 앞에 나와 있는 방법을 사용하여 카메라 프로필 사용을 지원하는 캡처 디바이스의 ID를 가져옵니다.

선택한 디바이스 ID를 전달 하여 새 MediaCaptureInitializationSettings 개체를 만듭니다. 정적 메서드 MediaCapture.FindAllVideoProfiles 를 호출하여 디바이스에서 지원하는 모든 카메라 프로필 목록을 가져옵니다.

다음은 Width, HeightFrameRate 속성이 요청된 값과 일치하는 SupportedRecordMediaDescription 개체가 포함된 프로필을 선택하는 예제입니다. 일치하는 항목이 발견되면 MediaCaptureInitializationSettingsVideoProfileRecordMediaDescription이 쿼리에서 반환된 값으로 설정됩니다. 일치하는 항목이 없으면 기본 프로필이 사용됩니다.

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를 호출하여 원하는 프로필로 구성하기만 하면 됩니다.

await m_mediaCapture.InitializeAsync(mediaInitSettings);

KnownVideoProfile을 사용하여 디바이스 선택

MediaFrameSourceGroup 클래스를 사용하여 MediaCapture 개체를 초기화하기 전에 특정 기능을 사용하여 카메라 프로필을 가져올 수 있습니다. 프레임 원본 그룹을 사용하면 디바이스 제조업체가 센서 그룹을 나타내거나 기능을 단일 가상 디바이스로 캡처할 수 있습니다. 이렇게 하면 깊이 및 컬러 카메라를 함께 사용하는 것과 같은 계산 사진 시나리오를 사용할 수 있지만 간단한 캡처 시나리오를 위해 카메라 프로필을 선택하는 데 사용할 수도 있습니다. MediaFrameSourceGroup 사용에 대한 자세한 내용은 MediaFrameReader를 사용하여 미디어 프레임 처리를 참조하세요.

아래 예제에서는 MediaFrameSourceGroup 을 사용하여 원하는 시나리오를 지원하는 카메라 프로필을 찾는 방법을 보여 줍니다. MediaFrameSourceGroup.FindAllAsync를 호출하여 현재 디바이스에서 사용할 수 있는 모든 미디어 프레임 원본 그룹의 목록을 가져옵니다. 각 원본 그룹을 반복하고 MediaCapture.FindKnownVideoProfiles 를 호출하여 지정된 KnownCameraProfile을 지원하는 현재 소스 그룹에 대한 모든 비디오 프로필 목록을 가져옵니다. 이 예제에서는 KnownVideoProfile.HighQualityPhoto 값이 사용됩니다. 다른 값에는 예를 들어 HDR 및 가변 사진 시퀀스에 대한 지원이 포함됩니다. 요청된 조건을 충족하는 프로필을 찾은 경우 새 MediaCaptureInitializationSettings 개체를 만들고 VideoProfile 을 select 프로필로 설정하고 VideoDeviceId 를 현재 미디어 프레임 원본 그룹의 ID 속성으로 설정합니다. MediaCapture 개체를 초기화하려면 이 MediaCaptureInitializationSettings 개체를 사용합니다.

IReadOnlyList<MediaFrameSourceGroup> sourceGroups = await MediaFrameSourceGroup.FindAllAsync();
MediaCaptureInitializationSettings settings = null;

foreach (MediaFrameSourceGroup sg in sourceGroups)
{

    IReadOnlyList<MediaCaptureVideoProfile> profileList = MediaCapture.FindKnownVideoProfiles(
                                  sg.Id,
                                  KnownVideoProfile.HighQualityPhoto);

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

디바이스에서 동시 사진 및 비디오 캡처를 지원하는지 확인

많은 디바이스는 사진 및 비디오 캡처를 동시에 지원합니다. 캡처 디바이스가 이를 지원하는지 확인하려면 MediaCapture.FindAllVideoProfiles 를 호출하여 디바이스에서 지원하는 모든 카메라 프로필을 가져옵니다. 링크 쿼리를 사용하여 SupportedPhotoMediaDescriptionSupportedRecordMediaDescription 둘 다에 대해 하나 이상의 항목이 있는 프로필을 찾습니다. 즉, 프로필이 동시 캡처를 지원합니다.


bool 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;
}

이 쿼리를 구체화하여 동시 비디오 레코드 외에도 특정 해상도 또는 기타 기능을 지원하는 프로필을 찾을 수 있습니다. MediaCapture.FindKnownVideoProfiles를 사용하고 BalancedVideoAndPhoto 값을 지정하여 동시 캡처를 지원하는 프로필을 검색할 수도 있지만 모든 프로필을 쿼리하면 더 완전한 결과를 제공합니다.