Entdecken und Auswählen von Kamerafunktionen mit Kameraprofilen in einer WinUI 3-App
In diesem Artikel wird gezeigt, wie Sie Kameraprofile verwenden, um die Funktionen verschiedener Videoaufnahmegeräte zu ermitteln und zu verwalten. Dies umfasst Aufgaben wie das Auswählen von Profilen, die bestimmte Auflösungen oder Bildfrequenzen unterstützen, Profile, die gleichzeitigen Zugriff auf mehrere Kameras unterstützen, und Profile, die HDR unterstützen.
Kameraprofile
Kameras auf verschiedenen Geräten unterstützen unterschiedliche Funktionen, einschließlich der Unterstützten Aufnahmeauflösungen, der Bildfrequenz für Videoaufnahmen und ob HDR- oder variable Bildfrequenzaufnahmen unterstützt werden. Eine Reihe von unterstützten Funktionalitäten wird in einem MediaCaptureVideoProfileMediaDescription-Objekt festgelegt. Ein Kameraprofil, dargestellt durch ein MediaCaptureVideoProfile-Objekt, verfügt über drei Sammlungen von Medienbeschreibungen: eine für die Fotoaufnahme, eine für die Videoaufnahme und eine andere für die Videovorschau.
Bevor Sie Ihr MediaCapture--Objekt initialisieren, können Sie die Aufnahmegeräte auf dem aktuellen Gerät abfragen, um zu sehen, welche Profile unterstützt werden. Wenn Sie ein unterstütztes Profil auswählen, wissen Sie, dass das Aufnahmegerät alle Funktionen in den Medienbeschreibungen des Profils unterstützt. Dies beseitigt die Notwendigkeit eines Test- und Fehleransatzes, um zu bestimmen, welche Kombinationen von Funktionen auf einem bestimmten Gerät unterstützt werden.
Suchen einer Kamera, die Kameraprofile unterstützt
Um Kameraprofile zu verwenden, müssen Sie zuerst nach einem Kameragerät suchen, das die Verwendung von Kameraprofilen unterstützt. Das folgende Beispiel zeigt, wie Sie die DeviceInformation.FindAllAsync- Methode verwenden, um eine Liste aller verfügbaren Videoaufnahmegeräte auf der Vorderseite oder auf der Rückseite des aktuellen Geräts abzurufen. Sie führt eine Schleife durch alle Geräte in der Liste aus und ruft die statische Methode IsVideoProfileSupported für jedes Gerät auf, um zu überprüfen, ob es Videoprofile unterstützt.
Wenn ein Gerät, das Kameraprofile unterstützt, im angegebenen Bereich gefunden wird, wird der wert ID zurückgegeben, der die ID-Zeichenfolge des Geräts enthält.
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;
}
Wenn die von der GetVideoProfileSupportedDeviceIdAsync-Hilfsmethode zurückgegebene Geräte-ID NULL oder eine leere Zeichenfolge ist, gibt es im angegebenen Bereich kein Gerät, das Kameraprofile unterstützt. In diesem Fall sollten Sie Ihr Medienaufnahmegerät ohne Profile initialisieren.
string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Auswählen eines Profils basierend auf unterstützter Auflösung und Bildfrequenz
Wenn Sie ein Profil mit bestimmten Funktionen auswählen möchten, z. B. mit der Möglichkeit, eine bestimmte Auflösung und Bildfrequenz zu erzielen, verwenden Sie die in diesem Artikel gezeigte Methode, um die ID eines Aufnahmegeräts abzurufen, das die Verwendung von Kameraprofilen unterstützt.
Erstellen Sie ein neues MediaCaptureInitializationSettings-Objekt, und übergeben Sie die ausgewählte Geräte-ID. Rufen Sie die statische Methode MediaCapture.FindAllVideoProfiles auf, um eine Liste aller kameraprofile abzurufen, die vom Gerät unterstützt werden.
In diesem Beispiel wird ein Profil ausgewählt, das ein SupportedRecordMediaDescription-Objekt enthält, bei dem die Eigenschaften Width, Height und FrameRate mit den angefragten Werten übereinstimmen. Wird eine Übereinstimmung gefunden, werden VideoProfile und RecordMediaDescription der MediaCaptureInitializationSettings auf die von der Abfrage zurückgegebenen Werte festgelegt. Wenn keine Übereinstimmung gefunden wird, wird das Standardprofil verwendet.
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];
}
Nachdem Sie die MediaCaptureInitializationSettings mit Ihrem gewünschten Kameraprofil aufgefüllt haben, rufen Sie einfach InitializeAsync für Ihr Medienaufnahmeobjekt auf, um es für das gewünschte Profil zu konfigurieren.
await m_mediaCapture.InitializeAsync(mediaInitSettings);
Geräte mit KnownVideoProfile auswählen
Sie können die MediaFrameSourceGroup Klasse verwenden, um Kameraprofile mit bestimmten Funktionen abzurufen, bevor Sie das MediaCapture-Objekt initialisieren. Frame-Quellgruppen ermöglichen es Geräteherstellern, Gruppen von Sensoren oder Aufzeichnungsfähigkeiten als einzelnes virtuelles Gerät darzustellen. Dies ermöglicht rechenbasierte Fotoszenarien wie die gemeinsame Verwendung von Tiefen- und Farbkameras, kann aber auch zum Auswählen von Kameraprofilen für einfache Aufnahmeszenarien verwendet werden. Weitere Informationen zur Verwendung von MediaFrameSourceGroup finden Sie unter Verarbeiten von Medienframes mit MediaFrameReader.
Das folgende Beispiel zeigt, wie Sie MediaFrameSourceGroup verwenden, um ein Kameraprofil zu finden, das das gewünschte Szenario unterstützt. Rufen Sie MediaFrameSourceGroup.FindAsync auf, um eine Liste aller auf dem aktuellen Gerät verfügbaren Medienframe-Quellgruppen zu erhalten. Führen Sie eine Schleife durch jede Quellgruppe und rufen Sie MediaCapture.FindKnownVideoProfiles auf, um eine Liste aller Videoprofile für die aktuelle Quellgruppe zu erhalten, die das angegebene KnownCameraProfile unterstützen. In diesem Beispiel wird der Wert KnownVideoProfile.HighQualityPhoto verwendet. Andere Werte umfassen beispielsweise unterstützung für HDR- und variable Fotosequenzen. Wenn ein Profil gefunden wird, das die angefragten Kriterien erfüllt, erstellen Sie ein neues MediaCaptureInitializationSettings-Objekt und legen das VideoProfile auf das ausgewählte Profil und die VideoDeviceId auf die Id-Eigenschaft der aktuellen Medienrahmen-Quellgruppe fest. Verwenden Sie dieses MediaCaptureInitializationSettings Objekt, um das MediaCapture-Objekt zu initialisieren.
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;
}
}
Ermitteln, ob ein Gerät gleichzeitige Foto- und Videoaufnahme unterstützt
Viele Geräte unterstützen die gleichzeitige Aufnahme von Fotos und Videos. Um festzustellen, ob ein Aufnahmegerät dies unterstützt, rufen Sie MediaCapture.FindAllVideoProfiles auf, um alle vom Gerät unterstützten Kameraprofile abzurufen. Verwenden Sie eine Linkabfrage, um ein Profil zu finden, das mindestens einen Eintrag für SupportedPhotoMediaDescription und SupportedRecordMediaDescription enthält, was bedeutet, dass das Profil die gleichzeitige Aufnahme unterstützt.
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;
}
Sie können diese Abfrage verfeinern, um nach Profilen zu suchen, die bestimmte Auflösungen oder andere Funktionen zusätzlich zu gleichzeitiger Videoaufzeichnung unterstützen. Sie können auch MediaCapture.FindKnownVideoProfiles verwenden und den Wert BalancedVideoAndPhoto angeben, um Profile abzurufen, die die gleichzeitige Aufnahme unterstützen. Mit einer Abfrage aller Profile erhalten Sie jedoch vollständigere Ergebnisse.
Zugehörige Themen
Windows developer