Entdecken und Auswählen von Kamerafunktionen mit Kameraprofilen
In diesem Artikel wird erläutert, wie Sie Kameraprofile verwenden, um die Funktionen verschiedener Videoaufnahmegeräte zu ermitteln und zu verwalten. Dazu gehören Aufgaben, z. B. das Auswählen von Profilen, die bestimmte Auflösungen oder Bildfrequenzen unterstützen, von Profilen, die gleichzeitigen Zugriff auf mehrere Kameras unterstützen, sowie von Profilen, die HDR unterstützen.
Hinweis
Dieser Artikel baut auf Konzepten und Code auf, die unter Allgemeine Foto-, Video- und Audioaufnahme mit „MediaCapture“ erläutert werden. Dort werden die Schritte für die Implementierung einer grundlegenden Foto- und Videoaufnahme beschrieben. Es wird empfohlen, dass Sie sich mit dem grundlegenden Muster für die Medienerfassung in diesem Artikel vertraut machen, bevor Sie in fortgeschrittene Aufnahmeszenarien einsteigen. Der Code in diesem Artikel setzt voraus, dass Ihre App bereits über eine korrekt initialisierte MediaCapture-Instanz verfügt.
Kameraprofile
Kameras auf verschiedenen Geräten unterstützen unterschiedliche Funktionen, einschließlich der unterstützten Aufnahmeauflösungen, der Bildfrequenz für Videoaufnahmen und der Einstellung, ob HDR-Aufnahmen (High Dynamic Range) oder Aufnahmen mit variabler Bildfrequenz unterstützt werden. Das Framework für die Medienaufnahme der universellen Windows-Plattform speichert diese Funktionen in einer MediaCaptureVideoProfileMediaDescription. 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 weitere 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. Damit entfällt die Notwendigkeit, nach dem Trial-and-Error-Prinzip zu testen, welche Kombinationen von Funktionen auf einem bestimmten Gerät unterstützt werden.
var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };
Die Codebeispiele in diesem Artikel ersetzen diese minimale Initialisierung durch die Ermittlung von Kameraprofilen, die verschiedene Funktionen unterstützen und dann zum Initialisieren des Medienaufnahmegeräts verwendet werden.
Ermitteln eines Videogeräts, das Kameraprofile unterstützt
Bevor Sie nach unterstützten Kameraprofilen suchen, sollten Sie ein Aufnahmegerät ermitteln, das die Verwendung von Kameraprofilen unterstützt. Die im folgenden Beispiel definierte GetVideoProfileSupportedDeviceIdAsync-Hilfsmethode verwendet die DeviceInformation.FindAllAsync-Methode zum Abrufen einer Liste aller verfügbaren Videoaufnahmegeräte. 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. Außerdem können Sie mit der EnclosureLocation.Panel-Eigenschaft für jedes Gerät angeben, ob Sie eine Frontkamera oder eine rückseitige Kamera wünschen.
Wenn ein Gerät, das Kameraprofile unterstützt, im angegebenen Bereich gefunden wird, wird der ID-Wert 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 der unterstützten Auflösung und Bildfrequenz
Um ein Profil mit bestimmten Funktionen auszuwählen (z. B. mit der Möglichkeit, eine bestimmte Auflösung und Bildfrequenz zu erzielen), sollten Sie zuerst die oben beschriebene Hilfsmethode aufrufen, 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 als Nächstes die statische Methode MediaCapture.FindAllVideoProfiles auf, um eine Liste aller Kameraprofile abzurufen, die vom Gerät unterstützt werden.
In diesem Beispiel wird eine Linq-Abfragemethode verwendet, die im Using-Namespace System.Linq enthalten ist, um ein Profil auszuwählen, das ein SupportedRecordMediaDescription-Objekt enthält, in dem die Eigenschaften Width, Height, und FrameRate den angeforderten Werten entsprechen. Wenn eine Übereinstimmung gefunden wird, werden das VideoProfile und die RecordMediaDescription der MediaCaptureInitializationSettings auf die Werte des anonymen Typs festgelegt, der von der Linq-Abfrage zurückgegeben wird. Wird keine Übereinstimmung gefunden, 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 _mediaCapture.InitializeAsync(mediaInitSettings);
Verwenden von Medienframequellgruppen zum Abrufen von Profilen
Ab Windows 10 Version 1803 können Sie die MediaFrameSourceGroup-Klasse verwenden, um Kameraprofile mit bestimmten Funktionen abzurufen, bevor Sie das MediaCapture-Objekt initialisieren. Framequellgruppen ermöglichen es Geräteherstellern, Gruppen von Sensoren oder Aufnahmefunktionen als einzelnes virtuelles Gerät darzustellen. Dies ermöglicht computerbasierte Fotografieszenarien 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.
Die folgende Beispielmethode zeigt, wie Sie MediaFrameSourceGroup-Objekte verwenden, um ein Kameraprofil zu finden, das ein bekanntes Videoprofil unterstützt, z. B. ein Profil, das HDR oder variable Fotosequenzen unterstützt. Rufen Sie zunächst MediaFrameSourceGroup.FindAllAsync auf, um eine Liste aller Medienframequellgruppen abzurufen, die auf dem aktuellen Gerät verfügbar sind. Führen Sie eine Schleife durch jede Quellgruppe aus, und rufen Sie MediaCapture.FindKnownVideoProfiles auf, um eine Liste aller Videoprofile für die aktuelle Quellgruppe zu erhalten, die das angegebene Profil unterstützen, in diesem Fall HDR mit Fotos mit breiter Farbskala (Wide Color Gamut, WCG). Wenn ein Profil gefunden wird, das die Kriterien erfüllt, erstellen Sie ein neues MediaCaptureInitializationSettings-Objekt, und legen Sie VideoProfile auf das ausgewählte Profil und VideoDeviceId auf die Id-Eigenschaft der aktuellen Medienframequellgruppe fest. So könnten Sie beispielsweise den Wert KnownVideoProfile.HdrWithWcgVideo an diese Methode übergeben, um Medienaufnahmeeinstellungen abzurufen, die HDR-Video unterstützen. Übergeben Sie KnownVideoProfile.VariablePhotoSequence, um Einstellungen abzurufen, die variable Fotosequenzen unterstützen.
private async Task<MediaCaptureInitializationSettings> GetKnownVideoProfile(KnownVideoProfile knownVideoProfile)
{
IReadOnlyList<MediaFrameSourceGroup> sourceGroups = await MediaFrameSourceGroup.FindAllAsync();
MediaCaptureInitializationSettings settings = null;
foreach (MediaFrameSourceGroup sg in sourceGroups)
{
// Find a device that support VariablePhotoSequence
IReadOnlyList<MediaCaptureVideoProfile> profileList = MediaCapture.FindKnownVideoProfiles(
sg.Id,
knownVideoProfile); // e.g. KnownVideoProfile.HdrWithWcgVideo
if (profileList.Count > 0)
{
settings = new MediaCaptureInitializationSettings();
settings.VideoProfile = profileList[0];
settings.VideoDeviceId = sg.Id;
break;
}
}
return settings;
}
Verwenden bekannter Profile zum Ermitteln eines Profils, das HDR-Video unterstützt (Legacytechnik)
Hinweis
Die in diesem Abschnitt beschriebenen APIs gelten ab Windows 10 Version 1803 als veraltet. Weitere Informationen finden Sie im vorherigen Abschnitt Verwenden von Medienframequellgruppen zum Abrufen von Profilen.
Die Auswahl eines Profils, das HDR unterstützt, beginnt wie die anderen Szenarien. Erstellen Sie ein MediaCaptureInitializationSettings-Objekt und eine Zeichenfolge für die Aufnahmegerät-ID. Fügen Sie eine boolesche Variable hinzu, die nachverfolgt, ob HDR-Video unterstützt wird.
MediaCaptureInitializationSettings mediaInitSettings = new MediaCaptureInitializationSettings();
string videoDeviceId = string.Empty;
bool HdrVideoSupported = false;
Verwenden Sie die oben beschriebene GetVideoProfileSupportedDeviceIdAsync-Hilfsmethode, um die Geräte-ID für ein Aufnahmegerät abzurufen, das Kameraprofile unterstützt.
// Select the first video capture device found on the back of the device
videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Die statische Methode MediaCapture.FindKnownVideoProfiles gibt die Kameraprofile zurück, die vom angegebenen Gerät unterstützt werden, das durch den angegebenen KnownVideoProfile-Wert kategorisiert wird. Für dieses Szenario wird der VideoRecording-Wert angegeben, um die zurückgegebenen Kameraprofile auf diejenigen zu beschränken, die die Videoaufnahme unterstützen.
Führen Sie eine Schleife durch die zurückgegebene Liste von Kameraprofilen aus. Führen Sie für jedes Kameraprofil eine Schleife durch jede VideoProfileMediaDescription im Profil aus, um zu überprüfen, ob die IsHdrVideoSupported-Eigenschaft „true“ ist. Nachdem eine geeignete Medienbeschreibung gefunden wurde, verlassen Sie die Schleife, und weisen Sie dem MediaCaptureInitializationSettings-Objekt die Profil- und Beschreibungsobjekte zu.
IReadOnlyList<MediaCaptureVideoProfile> profiles =
MediaCapture.FindKnownVideoProfiles(videoDeviceId, KnownVideoProfile.VideoRecording);
// Walk through available profiles, look for first profile with HDR supported Video Profile
foreach (MediaCaptureVideoProfile profile in profiles)
{
IReadOnlyList<MediaCaptureVideoProfileMediaDescription> recordMediaDescription =
profile.SupportedRecordMediaDescription;
foreach (MediaCaptureVideoProfileMediaDescription videoProfileMediaDescription in recordMediaDescription)
{
if (videoProfileMediaDescription.IsHdrVideoSupported)
{
// We've located the profile and description for HDR Video, set profile and flag
mediaInitSettings.VideoProfile = profile;
mediaInitSettings.RecordMediaDescription = videoProfileMediaDescription;
HdrVideoSupported = true;
break;
}
}
if (HdrVideoSupported)
{
// Profile with HDR support found. Stop looking.
break;
}
}
Ermitteln, ob ein Gerät die gleichzeitige Foto- und Videoaufnahme unterstützt
Viele Geräte unterstützen die gleichzeitige Aufnahme von Fotos und Videos. Um zu ermitteln, ob ein Aufnahmegerät diese Funktion unterstützt, rufen Sie MediaCapture.FindAllVideoProfiles auf, um eine Liste aller 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.
var 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 zusätzlich zur gleichzeitigen Videoaufzeichnung bestimmte Auflösungen oder andere Funktionen 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