Sdílet prostřednictvím


Zjišťování a výběr možností fotoaparátu pomocí profilů fotoaparátů v aplikaci WinUI

Tento článek ukazuje, jak pomocí profilů fotoaparátu zjistit a spravovat možnosti různých zařízení pro zachycení videa. To zahrnuje úlohy, jako je výběr profilů, které podporují konkrétní rozlišení nebo snímkové frekvence, profily, které podporují souběžný přístup k více fotoaparátům a profilům podporujícím HDR.

O profilech fotoaparátu

Kamery na různých zařízeních podporují různé možnosti, včetně sady podporovaných rozlišení zachycení, frekvence snímků pro snímky videa a toho, jestli jsou podporované snímky HDR nebo proměnlivé snímkové frekvence. Sada podporovaných schopností je definována v MediaCaptureVideoProfileMediaDescription objektu. Profil kamery reprezentovaný objektem MediaCaptureVideoProfile má tři kolekce popisů médií; jeden pro pořizování fotek, jeden pro zachycení videa a druhý pro náhled videa.

Před inicializací objektu MediaCapture můžete dotazovat zařízení pro zachytávání na aktuálním zařízení a zjistit, jaké profily jsou podporované. Když vyberete podporovaný profil, víte, že zařízení pro zachytávání podporuje všechny možnosti v popisech médií profilu. Tím se eliminuje potřeba přístupu ke zkušebnímu a chybovému přístupu k určení, které kombinace funkcí jsou na konkrétním zařízení podporované.

Najděte fotoaparát, který podporuje profily fotoaparátů

Pokud chcete použít profily fotoaparátu, musíte nejprve zkontrolovat zařízení fotoaparátu, které podporuje použití profilů fotoaparátu. Následující příklad ukazuje, jak pomocí metody DeviceInformation.FindAllAsync načíst seznam všech dostupných zařízení pro zachycení videa na předním nebo zadním panelu aktuálního zařízení. Prochází všechna zařízení v seznamu a volá statickou metodu IsVideoProfileSupported, aby se zjistilo, jestli podporuje profily videa.

Pokud se na zadaném panelu najde zařízení, které podporuje profily fotoaparátu, vrátí se hodnota ID obsahující řetězec ID zařízení.

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

Pokud je ID zařízení vrácené z pomocné metody GetVideoProfileSupportedDeviceIdAsync null nebo prázdný řetězec, na zadaném panelu není žádné zařízení, které podporuje profily fotoaparátu. V takovém případě byste měli inicializovat zařízení pro zachytávání médií bez použití profilů.

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

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

Vyberte profil na základě podporovaného rozlišení a frekvence snímků.

Pokud chcete vybrat profil s konkrétními možnostmi, jako je například schopnost dosáhnout určitého rozlišení a frekvence snímků, použijte metodu uvedenou výše v tomto článku k získání ID zařízení pro zachytávání, které podporuje použití profilů fotoaparátu.

Vytvořte nový objekt MediaCaptureInitializationSettings , který předává vybrané ID zařízení. Zavoláním statické metody MediaCapture.FindAllVideoProfiles získáte seznam všech profilů fotoaparátů podporovaných zařízením.

Tento příklad vybere profil, který obsahuje SupportedRecordMediaDescription objekt, kde vlastnosti Width, Height a FrameRate odpovídají požadovaným hodnotám. Pokud je nalezena shoda, VideoProfile a RecordMediaDescriptionMediaCaptureInitializationSettings jsou nastaveny na hodnoty vrácené z dotazu. Pokud se nenajde žádná shoda, použije se výchozí profil.

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

Po naplnění MediaCaptureInitializationSettings požadovaným profilem fotoaparátu jednoduše zavoláte InitializeAsync na objektu pro zachytávání médií, abyste ho nakonfigurovali na požadovaný profil.

await m_mediaCapture.InitializeAsync(mediaInitSettings);

Vyberte zařízení s KnownVideoProfile

Před inicializací objektu MediaCapture můžete pomocí třídy MediaFrameSourceGroup získat profily fotoaparátu s konkrétními možnostmi. Skupiny zdrojů rámců umožňují výrobcům zařízení reprezentovat skupiny senzorů nebo zachytávat funkce jako jedno virtuální zařízení. To umožňuje výpočetní scénáře fotografie, jako je použití hloubkové a barevné kamery společně, ale také lze použít k výběru profilů fotoaparátů pro jednoduché scénáře zachycení. Další informace o použití MediaFrameSourceGroup naleznete v tématu Zpracování mediálních rámců pomocí MediaFrameReader.

Následující příklad ukazuje, jak pomocí MediaFrameSourceGroup najít profil kamery, který podporuje požadovaný scénář. Zavolejte MediaFrameSourceGroup.FindAllAsync a získejte seznam všech zdrojových skupin snímků médií, které jsou k dispozici na aktuálním zařízení. Projděte každou zdrojovou skupinu a volejte MediaCapture.FindKnownVideoProfiles , abyste získali seznam všech profilů videa pro aktuální zdrojovou skupinu, která podporuje zadanou hodnotu KnownCameraProfile, v tomto příkladu se použije hodnota KnownVideoProfile.HighQualityPhoto . Mezi další hodnoty patří podpora HDR a proměnných sekvencí fotek, například. Pokud se najde profil, který splňuje požadovaná kritéria, vytvořte nový objekt MediaCaptureInitializationSettings a nastavte VideoProfile na vybraný profil a VideoDeviceId na ID vlastnosti aktuální skupiny zdroje rámce médií. Tento objekt MediaCaptureInitializationSettings použijte k inicializaci objektu MediaCapture.

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

Určení, jestli zařízení podporuje souběžné pořizování fotek a videí

Mnoho zařízení podporuje zachytávání fotek a videí současně. Pokud chcete zjistit, jestli zařízení pro zachytávání podporuje, zavolejte MediaCapture.FindAllVideoProfiles , abyste získali všechny profily fotoaparátu podporované zařízením. Pomocí dotazu odkazu vyhledejte profil, který má alespoň jednu položku pro SupportedPhotoMediaDescription i SupportedRecordMediaDescription , což znamená, že profil podporuje souběžné zachycení.


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

Tento dotaz můžete upřesnit tak, aby vyhledaly profily, které podporují konkrétní rozlišení nebo jiné možnosti kromě souběžného záznamu videa. Můžete také použít MediaCapture.FindKnownVideoProfiles a zadat hodnotu BalancedVideoAndPhoto k načtení profilů, které podporují souběžné zachytávání, ale dotazování na všechny profily poskytne podrobnější výsledky.