Aracılığıyla paylaş


WinUI 3 uygulamasında kamera profilleriyle kamera özelliklerini keşfedin ve seçin

Bu makalede, farklı video yakalama cihazlarının özelliklerini keşfetmek ve yönetmek için kamera profillerinin nasıl kullanılacağı gösterilmektedir. Bu, belirli çözünürlükleri veya kare hızlarını destekleyen profilleri seçme, birden çok kameraya eşzamanlı erişimi destekleyen profiller ve HDR'yi destekleyen profiller gibi görevleri içerir.

Kamera profilleri hakkında

Farklı cihazlardaki kameralar desteklenen yakalama çözünürlükleri kümesi, video yakalamalar için kare hızı ve HDR veya değişken kare hızı yakalamalarının desteklenip desteklenmediği gibi farklı özellikleri destekler. Desteklenen özellikler kümesi, MediaCaptureVideoProfileMediaDescription nesnesinde tanımlanır. MediaCaptureVideoProfile nesnesiyle temsil edilen kamera profilinin üç medya açıklaması koleksiyonu vardır; biri fotoğraf yakalama, diğeri video yakalama ve diğeri de video önizlemesi için.

MediaCapture nesnenizi başlatmadan önce, hangi profillerin desteklendiğine bakmak için geçerli cihazdaki yakalama cihazlarını sorgulayabilirsiniz. Desteklenen bir profil seçtiğinizde, yakalama cihazının profilin medya açıklamalarındaki tüm özellikleri desteklediğini bilirsiniz. Bu, belirli bir cihazda hangi özellik bileşimlerinin desteklendiğine karar vermek için deneme ve hata yaklaşımı gereksinimini ortadan kaldırır.

Kamera profillerini destekleyen bir kamera bulma

Kamera profillerini kullanmak için önce kamera profillerinin kullanımını destekleyen bir kamera cihazı olup olmadığını denetlemeniz gerekir. Aşağıdaki örnekte, geçerli cihazın ön veya arka panelindeki tüm kullanılabilir video yakalama cihazlarının listesini almak için DeviceInformation.FindAllAsync yönteminin nasıl kullanılacağı gösterilmektedir. Her cihazın video profillerini desteklenip desteklemediğini görmek için isVideoProfileSupportedstatik yöntemini çağırarak listedeki tüm cihazlar arasında döngü oluşturur.

Belirtilen panelde kamera profillerini destekleyen bir cihaz bulunursa, cihazın kimlik dizesini içeren Kimliği değeri döndürülür.

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 yardımcı yönteminin cihaz kimliğini null veya boş bir dize olarak döndürdüğü durumda, belirtilen panelde kamera profillerini destekleyen bir cihaz yoktur. Bu durumda, profil kullanmadan medya yakalama cihazınızı başlatmanız gerekir.

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

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

Desteklenen çözünürlük ve kare hızına göre bir profil seçin

Belirli bir çözünürlük ve kare hızı elde etme gibi belirli özelliklere sahip bir profil seçmek için, kamera profillerini kullanmayı destekleyen bir yakalama cihazının kimliğini almak için bu makalede daha önce gösterilen yöntemi kullanın.

Yeni bir MediaCaptureInitializationSettings nesnesi oluşturun ve seçili cihaz kimliğini geçirin. Cihaz tarafından desteklenen tüm kamera profillerinin listesini almak için MediaCapture.FindAllVideoProfiles statik yöntemini çağırın.

Bu örnekte, Width, Heightve FrameRate özelliklerinin istenen değerlerle eşleştiği SupportedRecordMediaDescription nesnesi içeren bir profil seçilir. Eğer bir eşleşme bulunursa, VideoProfile ve RecordMediaDescription, MediaCaptureInitializationSettings, sorgudan döndürülen değerlere ayarlanır. Eşleşme bulunmazsa varsayılan profil kullanılır.

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 istediğiniz kamera profiliyle doldurduktan sonra, medya yakalama nesnenizde InitializeAsync çağırarak istediğiniz profile yapılandırmanız yeterlidir.

await m_mediaCapture.InitializeAsync(mediaInitSettings);

BilinenVideoProfile ile cihazları seçme

MediaCapture nesnesini başlatmadan önce belirli özelliklere sahip kamera profillerini almak için MediaFrameSourceGroup sınıfını kullanabilirsiniz. Çerçeve kaynak grupları, cihaz üreticilerinin algılayıcı gruplarını veya yakalama özelliklerini tek bir sanal cihaz olarak temsil etmelerini sağlar. Bu, derinlik ve renk kameralarını birlikte kullanma gibi hesaplamalı fotoğraf senaryolarına olanak tanır, ancak basit yakalama senaryoları için kamera profillerini seçmek için de kullanılabilir. MediaFrameSourceGroupkullanma hakkında daha fazla bilgi için bkz. MediaFrameReader ile medya çerçevelerini işleme.

Aşağıdaki örnekte, istenen senaryoyu destekleyen bir kamera profili bulmak için MediaFrameSourceGroup nasıl kullanılacağı gösterilmektedir. Geçerli cihazda kullanılabilen tüm medya çerçevesi kaynak gruplarının listesini almak için MediaFrameSourceGroup.FindAllAsync çağırın. Belirtilen KnownCameraProfiledestekleyen geçerli kaynak grubunun tüm video profillerinin listesini almak için her kaynak grubu arasında döngü yapın ve MediaCapture.FindKnownVideoProfiles çağrısı yapın. Bu örnekte KnownVideoProfile.HighQualityPhoto değeri kullanılır. Diğer değerler arasında HDR desteği ve örneğin değişken fotoğraf dizileri yer alır. İstenen ölçütleri karşılayan bir profil bulunursa, yeni bir MediaCaptureInitializationSettings nesnesi oluşturun ve VideoProfile seçme profiline ve VideoDeviceId geçerli medya çerçevesi kaynak grubunun Kimliği özelliğine ayarlayın. MediaCapture nesnesini başlatmak için mediaCaptureInitializationSettings nesnesini kullanın.

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

Bir cihazın eşzamanlı fotoğraf ve video yakalamayı destekleyip desteklemediğini belirleme

Birçok cihaz aynı anda fotoğraf ve video yakalamayı destekler. Yakalama cihazının bunu destekleyip desteklemediğini belirlemek için, cihaz tarafından desteklenen tüm kamera profillerini almak için MediaCapture.FindAllVideoProfiles çağrısı yapın. Hem SupportedPhotoMediaDescription hem de SupportedRecordMediaDescription için en az bir girişi olan bir profil bulmak için bağlantı sorgusu kullanın; bu da profilin eşzamanlı yakalamayı desteklediği anlamına gelir.


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

Bu sorguyu, aynı anda video kaydına ek olarak belirli çözünürlükleri veya diğer özellikleri destekleyen profilleri aramak için geliştirebilirsiniz. MediaCapture.FindKnownVideoProfiles kullanabilir ve eşzamanlı yakalamayı destekleyen profilleri almak için BalancedVideoAndPhoto değerini belirtebilirsiniz, ancak tüm profilleri sorgulamak daha eksiksiz sonuçlar sağlar.

  • Kamera
  • MediaCapture ile Temel fotoğraf, video ve ses yakalama