Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule pokazano, jak używać profilów aparatów do odnajdywania możliwości różnych urządzeń do przechwytywania wideo i zarządzania nimi. Obejmuje to zadania, takie jak wybieranie profilów obsługujących określone rozdzielczości lub współczynniki klatek, profile, które obsługują równoczesny dostęp do wielu kamer i profilów obsługujących funkcję HDR.
Informacje o profilach aparatów
Aparaty fotograficzne na różnych urządzeniach obsługują różne możliwości, w tym zestaw obsługiwanych rozdzielczości przechwytywania, szybkość klatek na klatkę w przypadku przechwytywania wideo oraz czy obsługiwane są przechwytywanie obrazu HDR lub zmiennej szybkości klatek. Zestaw obsługiwanych możliwości jest definiowany w obiekcie MediaCaptureVideoProfileMediaDescription . Profil kamery reprezentowany przez obiekt MediaCaptureVideoProfile ma trzy kolekcje opisów multimediów; jeden do przechwytywania zdjęć, jeden do przechwytywania wideo, a drugi do podglądu wideo.
Przed zainicjowaniem obiektu MediaCapture można wykonać zapytanie dotyczące urządzeń przechwytywania na bieżącym urządzeniu, aby zobaczyć, jakie profile są obsługiwane. Gdy wybierzesz obsługiwany profil, wiesz, że urządzenie do przechwytywania obsługuje wszystkie możliwości opisane w multimedialnych opisach profilu. Eliminuje to konieczność podejścia próbnego i błędu do określania, które kombinacje możliwości są obsługiwane na określonym urządzeniu.
Znajdowanie aparatu obsługującego profile aparatów fotograficznych
Aby korzystać z profilów aparatów fotograficznych, należy najpierw sprawdzić, czy urządzenie aparatu obsługuje korzystanie z profilów aparatów fotograficznych. W poniższym przykładzie pokazano, jak użyć metody DeviceInformation.FindAllAsync , aby pobrać listę wszystkich dostępnych urządzeń do przechwytywania wideo na przednim lub tylnym panelu bieżącego urządzenia. Wykonuje pętlę po wszystkich urządzeniach na liście, wywołując metodę statyczną IsVideoProfileSupported dla każdego urządzenia, aby sprawdzić, czy obsługuje profile wideo.
Jeśli na określonym panelu zostanie znalezione urządzenie obsługujące profile aparatu, zostanie zwrócona wartość Id, która zawiera ciąg identyfikacyjny urządzenia.
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;
}
Jeśli identyfikator urządzenia zwrócony przez metodę pomocniczą GetVideoProfileSupportedDeviceIdAsync ma wartość null lub jest pustym ciągiem, na określonym panelu nie ma żadnego urządzenia obsługującego profile kamer. W takim przypadku należy zainicjować urządzenie przechwytywania multimediów bez korzystania z profilów.
string videoDeviceId = await GetVideoProfileSupportedDeviceIdAsync(Windows.Devices.Enumeration.Panel.Back);
if (string.IsNullOrEmpty(videoDeviceId))
{
// No devices on the specified panel support video profiles. .
return;
}
Wybieranie profilu na podstawie obsługiwanej rozdzielczości i szybkości klatek
Aby wybrać profil z określonymi możliwościami, takimi jak możliwość osiągnięcia określonej rozdzielczości i szybkości klatek, użyj metody pokazanej wcześniej w tym artykule, aby uzyskać identyfikator urządzenia przechwytywania, które obsługuje korzystanie z profilów aparatów fotograficznych.
Utwórz nowy obiekt MediaCaptureInitializationSettings , przekazując wybrany identyfikator urządzenia. Wywołaj metodę statyczną MediaCapture.FindAllVideoProfiles , aby uzyskać listę wszystkich profilów aparatów obsługiwanych przez urządzenie.
W tym przykładzie wybrano profil zawierający obiekt SupportedRecordMediaDescription , w którym właściwości Width, Height i FrameRate są zgodne z żądanymi wartościami. Jeśli zostanie znalezione dopasowanie, parametr VideoProfile i RecordMediaDescription elementu MediaCaptureInitializationSettings zostaną ustawione na wartości zwrócone z zapytania. Jeśli nie zostanie znalezione dopasowanie, zostanie użyty profil domyślny.
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 wypełnieniu obiektu MediaCaptureInitializationSettings odpowiednim profilem aparatu wystarczy wywołać metodę InitializeAsync w obiekcie przechwytywania multimediów, aby skonfigurować go do żądanego profilu.
await m_mediaCapture.InitializeAsync(mediaInitSettings);
Wybieranie urządzeń za pomocą aplikacji KnownVideoProfile
Za pomocą klasy MediaFrameSourceGroup można uzyskać profile aparatów z określonymi możliwościami przed zainicjowaniem obiektu MediaCapture . Grupy źródeł ramek umożliwiają producentom urządzeń reprezentowanie grup czujników lub możliwości przechwytywania jako pojedynczego urządzenia wirtualnego. Umożliwia to scenariusze fotografii obliczeniowej, takie jak współpraca aparatów rejestrujących głębię i kolor, ale również do wyboru profili kamer dla prostych scenariuszy rejestrowania. Aby uzyskać więcej informacji na temat korzystania z elementu MediaFrameSourceGroup, zobacz Process media frame with MediaFrameReader (Przetwarzanie ramek multimedialnych za pomocą elementu MediaFrameReader).
W poniższym przykładzie pokazano, jak za pomocą elementu MediaFrameSourceGroup znaleźć profil aparatu, który obsługuje odpowiedni scenariusz. Wywołaj metodę MediaFrameSourceGroup.FindAllAsync , aby uzyskać listę wszystkich grup źródłowych ramek multimedialnych dostępnych na bieżącym urządzeniu. Wykonaj pętlę dla każdej grupy źródłowej i wywołaj metodę MediaCapture.FindKnownVideoProfiles, aby uzyskać listę wszystkich profili wideo dla bieżącej grupy źródłowej, które obsługują określony KnownCameraProfile. W tym przykładzie wartość używana to KnownVideoProfile.HighQualityPhoto. Inne wartości obejmują obsługę sekwencji zdjęć HDR i zmiennych, na przykład. Jeśli zostanie znaleziony profil spełniający żądane kryteria, utwórz nowy obiekt MediaCaptureInitializationSettings i ustaw plik VideoProfile na wybrany profil, a właściwość VideoDeviceId na właściwość Id bieżącej grupy źródłowej ramki multimediów. Użyj tego obiektu MediaCaptureInitializationSettings , aby zainicjować obiekt 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;
}
}
Określanie, czy urządzenie obsługuje jednoczesne przechwytywanie zdjęć i wideo
Wiele urządzeń obsługuje przechwytywanie zdjęć i wideo jednocześnie. Aby określić, czy urządzenie przechwytywania obsługuje tę funkcję, wywołaj metodę MediaCapture.FindAllVideoProfiles , aby uzyskać wszystkie profile kamer obsługiwane przez urządzenie. Użyj zapytania z odnośnikiem, aby znaleźć profil, który ma co najmniej jeden wpis zarówno dla SupportedPhotoMediaDescription jak i SupportedRecordMediaDescription, co oznacza, że profil obsługuje symultaniczne przechwytywanie.
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;
}
Można dostosować to zapytanie, aby wyszukiwać profile, które obsługują określone rozdzielczości lub inne możliwości, oprócz jednoczesnego rejestrowania wideo. Możesz również użyć elementu MediaCapture.FindKnownVideoProfiles i określić wartość BalancedVideoAndPhoto w celu pobrania profilów, które obsługują jednoczesne przechwytywanie, ale wykonywanie zapytań względem wszystkich profilów zapewni bardziej kompletne wyniki.