Kamerafunkciók felfedezése és kiválasztása kameraprofilokkal egy WinUI-alkalmazásban

Ez a cikk bemutatja, hogyan használhat kameraprofilokat a különböző videorögzítési eszközök képességeinek felderítésére és kezelésére. Ez olyan feladatokat is magában foglal, mint a meghatározott felbontásokat vagy képkockasebességeket támogató profilok kiválasztása, a több kamerához való egyidejű hozzáférést támogató profilok és a HDR-t támogató profilok.

Tudnivalók a kameraprofilokról

A különböző eszközök kamerái különböző képességeket támogatnak, beleértve a támogatott rögzítési felbontásokat, a videórögzítések képkockasebességét, valamint azt, hogy a HDR vagy a változó képkockasebesség-rögzítés támogatott-e. A támogatott képességek készlete egy MediaCaptureVideoProfileMediaDescription objektumban van definiálva. A MediaCaptureVideoProfile objektum által ábrázolt kameraprofil három médialeírás-gyűjteményből áll; az egyik a fényképrögzítéshez, egy a videófelvételhez, a másik pedig a videó előnézetéhez.

A MediaCapture-objektum inicializálása előtt lekérdezheti az aktuális eszközön lévő rögzítési eszközöket, hogy lássa, mely profilok támogatottak. Ha kiválaszt egy támogatott profilt, tudja, hogy a rögzítési eszköz támogatja a profil médialeírásaiban szereplő összes képességet. Így nincs szükség próbaverziós és hibakeresési megközelítésre annak meghatározásához, hogy az adott eszközön mely képességeket támogatja a rendszer.

Kameraprofilokat támogató kamera keresése

A kameraprofilok használatához először ellenőriznie kell, hogy van-e olyan kameraeszköz, amely támogatja a kameraprofilok használatát. Az alábbi példa bemutatja, hogyan használhatja a DeviceInformation.FindAllAsync metódust az összes rendelkezésre álló videorögzítési eszköz listájának lekéréséhez az aktuális eszköz előlapján vagy hátlapján. A lista összes eszközén végighalad, és meghívja az IsVideoProfileSupported statikus metódust, hogy ellenőrizze, támogatja-e a videóprofilokat.

Ha egy kameraprofilokat támogató eszköz található a megadott panelen, a rendszer visszaadja az eszköz azonosító sztringjét tartalmazó azonosítóértéket .

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

Ha a GetVideoProfileSupportedDeviceIdAsync segédmetódusból visszaadott eszközazonosító null értékű vagy üres sztring, a megadott panelen nincs olyan eszköz, amely támogatja a kameraprofilokat. Ebben az esetben profilok használata nélkül kell inicializálnia a médiarögzítő eszközt.

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

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

Profil kiválasztása a támogatott felbontás és a keretsebesség alapján

Ha olyan profilt szeretne kiválasztani, amely bizonyos képességekkel rendelkezik, például egy adott felbontás és képkockasebesség elérésére, használja a cikkben korábban bemutatott módszert egy olyan rögzítőeszköz azonosítójának lekéréséhez, amely támogatja a kameraprofilok használatát.

Hozzon létre egy új MediaCaptureInitializationSettings objektumot, amely a kijelölt eszközazonosítót adja át. Hívja meg a MediaCapture.FindAllVideoProfiles statikus metódust az eszköz által támogatott összes kameraprofil listájának lekéréséhez.

Ez a példa kiválaszt egy olyan profilt, amely egy SupportedRecordMediaDescription objektumot tartalmaz, ahol a Szélesség, Magasság és FrameRate tulajdonságok megfelelnek a kért értékeknek. Ha talál egyezést, a MediaCaptureInitializationSettingsVideoProfile és RecordMediaDescription értéke a lekérdezésből visszaadott értékekre lesz beállítva. Ha nem található egyezés, a rendszer az alapértelmezett profilt használja.

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

Miután feltöltötte a MediaCaptureInitializationSettingst a kívánt kameraprofillal, egyszerűen hívja meg az InitializeAsync-et a médiarögzítési objektumon, hogy konfigurálja a kívánt profilra.

await m_mediaCapture.InitializeAsync(mediaInitSettings);

Eszközök kiválasztása a KnownVideoProfile használatával

A MediaFrameSourceGroup osztály használatával a MediaCapture objektum inicializálása előtt lekérheti az adott képességekkel rendelkező kameraprofilokat. A keretforráscsoportok lehetővé teszik az eszközgyártók számára, hogy érzékelők csoportjait képviseljenek, vagy hogy egyetlen virtuális eszközként rögzítsék a képességeket. Ez lehetővé teszi a számítási fotózási forgatókönyveket, például a mélység- és színkamerák együttes használatát, de a kameraprofilok egyszerű rögzítési forgatókönyvekhez való kiválasztására is használható. További információ a MediaFrameSourceGroup használatáról: Médiakeretek feldolgozása a MediaFrameReaderrel.

Az alábbi példa bemutatja, hogyan kereshet olyan kameraprofilt a MediaFrameSourceGroup használatával, amely támogatja a kívánt forgatókönyvet. Hívja meg a MediaFrameSourceGroup.FindAllAsync parancsot az aktuális eszközön elérhető összes médiakeret-forráscsoport listájának lekéréséhez. Futtasson végig az egyes forráscsoportokon, és hívja meg a MediaCapture.FindKnownVideoProfiles parancsot, hogy lekérje a megadott KnownCameraProfile-t támogató aktuális forráscsoport összes videoprofiljának listáját. Ebben a példában a KnownVideoProfile.HighQualityPhoto értéket használjuk. Egyéb értékek például a HDR és a változó fotósorozatok támogatása. Ha a kért feltételeknek megfelelő profilt talál, hozzon létre egy új MediaCaptureInitializationSettings objektumot, és állítsa a VideoProfile-t a kiválasztási profilra, a VideoDeviceId azonosítót pedig az aktuális médiakeret-forráscsoport Azonosító tulajdonságára. Ezzel a MediaCaptureInitializationSettings objektummal inicializálhatja a MediaCapture objektumot.

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

Annak megállapítása, hogy egy eszköz támogatja-e az egyidejű fénykép- és videofelvételt

Számos eszköz támogatja a fényképek és videók egyidejű rögzítését. Annak megállapításához, hogy egy rögzítőeszköz támogatja-e ezt, hívja meg a MediaCapture.FindAllVideoProfiles-t , hogy megkapja az eszköz által támogatott összes kameraprofilt. Hivatkozáslekérdezéssel olyan profilt kereshet, amely legalább egy bejegyzéssel rendelkezik mind a SupportedPhotoMediaDescription , mind a SupportedRecordMediaDescription esetében, ami azt jelenti, hogy a profil támogatja az egyidejű rögzítést.


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

Ezt a lekérdezést finomíthatja, hogy olyan profilokat keressen, amelyek támogatják az adott megoldásokat vagy egyéb képességeket az egyidejű videorekord mellett. Használhatja a MediaCapture.FindKnownVideoProfiles értéket is, és megadhatja a BalancedVideoAndPhoto értéket az egyidejű rögzítést támogató profilok lekéréséhez, de az összes profil lekérdezése teljesebb eredményeket biztosít.