Individuare e selezionare le funzionalità della fotocamera con i profili di fotocamera
Questo articolo illustra come usare i profili della fotocamera per individuare e gestire le funzionalità di diversi dispositivi di acquisizione video. Sono incluse attività come la selezione di profili che supportano risoluzioni o frequenze di fotogrammi specifiche, profili che supportano l'accesso simultaneo a più fotocamere e profili che supportano HDR.
Nota
Questo articolo si basa sui concetti e sul codice descritti in Acquisizione di foto, video e audio di base con MediaCapture, che descrive i passaggi necessari per implementare l'acquisizione di foto e video di base. È consigliabile acquisire familiarità con il modello di acquisizione multimediale di base in questo articolo prima di passare a scenari di acquisizione più avanzati. Il codice in questo articolo presuppone che l'app abbia già un'istanza di MediaCapture che è stata inizializzata correttamente.
Informazioni sui profili della fotocamera
Le fotocamere su dispositivi diversi supportano diverse funzionalità, tra cui il set di risoluzioni di acquisizione supportate, la frequenza dei fotogrammi per le acquisizioni video e il fatto che siano supportate acquisizioni HDR o a frequenza di fotogrammi variabile. Il framework di acquisizione multimediale UWP (Universal Windows Platform) archivia questo set di funzionalità in una mediaCaptureVideoProfileMediaDescription. Un profilo della fotocamera, rappresentato da un oggetto MediaCaptureVideoProfile, include tre raccolte di descrizioni multimediali: una per l'acquisizione di foto, una per l'acquisizione video e un'altra per l'anteprima video.
Prima di inizializzare l'oggetto MediaCapture, è possibile eseguire una query sui dispositivi di acquisizione nel dispositivo corrente per vedere quali profili sono supportati. Quando si seleziona un profilo supportato, si sa che il dispositivo di acquisizione supporta tutte le funzionalità nelle descrizioni dei supporti del profilo. Ciò elimina la necessità di un approccio di valutazione ed errore per determinare quali combinazioni di funzionalità sono supportate in un determinato dispositivo.
var mediaInitSettings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };
Gli esempi di codice in questo articolo sostituiscono questa inizializzazione minima con l'individuazione dei profili della fotocamera che supportano varie funzionalità, che vengono quindi usate per inizializzare il dispositivo di acquisizione multimediale.
Trovare un dispositivo video che supporta i profili fotocamera
Prima di cercare i profili di fotocamera supportati, si dovrebbe trovare un dispositivo di acquisizione che supporti l'uso dei profili della fotocamera. Il metodo di supporto GetVideoProfileSupportedDeviceIdAsync definito nell'esempio seguente usa il metodo DeviceInformation.FindAllAsync per recuperare un elenco di tutti i dispositivi di acquisizione video disponibili. Scorre tutti i dispositivi nell'elenco, chiamando il metodo statico, IsVideoProfileSupported, per ogni dispositivo per verificare se supporta i profili video. Inoltre, la proprietà EnclosureLocation.Panel per ogni dispositivo, che consente di specificare se si desidera una fotocamera sulla parte anteriore o posteriore del dispositivo.
Se nel pannello specificato viene trovato un dispositivo che supporta i profili della fotocamera, viene restituito il valore ID contenente la stringa ID del dispositivo.
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;
}
Se l'ID dispositivo restituito dal metodo di supporto GetVideoProfileSupportedDeviceIdAsync è null o una stringa vuota, nel pannello specificato non è presente alcun dispositivo che supporta i profili della fotocamera. In questo caso, è necessario inizializzare il dispositivo di acquisizione multimediale senza usare i profili.
string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Selezionare un profilo in base alla risoluzione supportata e alla frequenza dei fotogrammi
Per selezionare un profilo con funzionalità specifiche, ad esempio con la possibilità di ottenere una risoluzione e una frequenza di fotogrammi specifica, è necessario chiamare prima di tutto il metodo di supporto definito in precedenza per ottenere l'ID di un dispositivo di acquisizione che supporta l'uso dei profili della fotocamera.
Creare un nuovo oggetto MediaCaptureInitializationSettings passando l'ID dispositivo selezionato. Chiamare quindi il metodo statico MediaCapture.FindAllVideoProfiles per ottenere un elenco di tutti i profili della fotocamera supportati dal dispositivo.
In questo esempio viene utilizzato un metodo di query Linq, incluso nello spazio dei nomi System.Linq, per selezionare un profilo contenente un oggetto SupportedRecordMediaDescription in cui le proprietà Width, Height e FrameRate corrispondono ai valori richiesti. Se viene trovata una corrispondenza, VideoProfile e RecordMediaDescription di MediaCaptureInitializationSettings vengono impostati sui valori del tipo anonimo restituito dalla query Linq. Se non viene trovata alcuna corrispondenza, viene usato il profilo predefinito.
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];
}
Dopo aver popolato MediaCaptureInitializationSettings con il profilo della fotocamera desiderato, è sufficiente chiamare InitializeAsync nell'oggetto acquisizione multimediale per configurarlo nel profilo desiderato.
await _mediaCapture.InitializeAsync(mediaInitSettings);
Usare i gruppi di origine dei fotogrammi multimediali per ottenere i profili
A partire da Windows 10, versione 1803, è possibile usare la classe MediaFrameSourceGroup per ottenere profili fotocamera con funzionalità specifiche prima di inizializzare l'oggetto MediaCapture. I gruppi di origine dei frame consentono ai produttori di dispositivi di rappresentare gruppi di sensori o funzionalità di acquisizione come un singolo dispositivo virtuale. Ciò consente scenari di fotografia computazionali come l'uso di fotocamere di profondità e colori insieme, ma può anche essere usato per selezionare i profili della fotocamera per scenari di acquisizione semplici. Per altre informazioni sull'uso di MediaFrameSourceGroup, vedere Elaborare fotogrammi multimediali con MediaFrameReader.
Il metodo di esempio seguente mostra come usare gli oggetti MediaFrameSourceGroup per trovare un profilo della fotocamera che supporta un profilo video noto, ad esempio uno che supporta HDR o sequenza di foto variabile. Prima di tutto, chiamare MediaFrameSourceGroup.FindAllAsync per ottenere un elenco di tutti i gruppi di origine dei fotogrammi multimediali disponibili nel dispositivo corrente. Scorrere ogni gruppo di origine e chiamare MediaCapture.FindKnownVideoProfiles per ottenere un elenco di tutti i profili video per il gruppo di origine corrente che supporta il profilo specificato, in questo caso HDR con foto WCG. Se viene trovato un profilo che soddisfa i criteri, creare un nuovo oggetto MediaCaptureInitializationSettings e impostare VideoProfile sul profilo di selezione e videoDeviceId sulla proprietà Id del gruppo di origine dei fotogrammi multimediali corrente. Ad esempio, è possibile passare il valore KnownVideoProfile.HdrWithWcgVideo in questo metodo per ottenere le impostazioni di acquisizione multimediale che supportano il video HDR. Passare KnownVideoProfile.VariablePhotoSequence per ottenere le impostazioni che supportano la sequenza di foto variabile.
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;
}
Usare profili noti per trovare un profilo che supporta video HDR (tecnica legacy)
Nota
Le API descritte in questa sezione sono deprecate a partire da Windows 10, versione 1803. Vedere la sezione precedente Usare i gruppi di origine dei fotogrammi multimediali per ottenere i profili.
La selezione di un profilo che supporta HDR inizia come gli altri scenari. Creare un oggetto MediaCaptureInitializationSettings e una stringa per contenere l'ID dispositivo di acquisizione. Aggiungere una variabile booleana che tenga traccia del fatto che il video HDR sia supportato o meno.
MediaCaptureInitializationSettings mediaInitSettings = new MediaCaptureInitializationSettings();
string videoDeviceId = string.Empty;
bool HdrVideoSupported = false;
Usare il metodo di supporto GetVideoProfileSupportedDeviceIdAsync definito in precedenza per ottenere l'ID dispositivo per un dispositivo di acquisizione che supporta i profili della fotocamera.
// 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;
}
Il metodo statico MediaCapture.FindKnownVideoProfiles restituisce i profili della fotocamera supportati dal dispositivo specificato categorizzato in base al valore KnownVideoProfile specificato. Per questo scenario, il valore VideoRecording viene specificato per limitare i profili della fotocamera restituiti a quelli che supportano la registrazione video.
Scorrere l'elenco restituito dei profili della fotocamera. Per ogni profilo della fotocamera, scorrere ogni VideoProfileMediaDescription nel controllo del profilo per verificare se la proprietà IsHdrVideoSupported è true. Dopo aver trovato una descrizione multimediale appropriata, interrompere il ciclo e assegnare gli oggetti profilo e descrizione all'oggetto MediaCaptureInitializationSettings.
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;
}
}
Determinare se un dispositivo supporta l'acquisizione simultanea di foto e video
Molti dispositivi supportano l'acquisizione simultanea di foto e video. Per determinare se un dispositivo di acquisizione supporta questa funzionalità, chiamare MediaCapture.FindAllVideoProfiles per ottenere tutti i profili della fotocamera supportati dal dispositivo. Usare una query di collegamento per trovare un profilo con almeno una voce per SupportedPhotoMediaDescription e SupportedRecordMediaDescription, il che significa che il profilo supporta l'acquisizione simultanea.
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;
}
È possibile perfezionare questa query per cercare i profili che supportano risoluzioni specifiche o altre funzionalità oltre al record video simultaneo. È possibile usare anche MediaCapture.FindKnownVideoProfiles e specificare il valore BalancedVideoAndPhoto per recuperare i profili che supportano l'acquisizione simultanea, ma l'esecuzione di query su tutti i profili fornirà risultati più completi.
Argomenti correlati