Каждый раз, когда я выполнял обновление на своем компьютере с Windows, я больше не могу использовать камеру в своем приложении UWP, которое использует класс MediaCapture
.
Изначально я получал UnuthorizedAccessException
при попытке вызвать функцию InitializeAsync()
, но мне удалось это исправить, добавив EnableFrameServerMode в свой регистр (по этой ссылке: https://www.macecraft.com/fix-webcam-issues-windows-10-anniversary-update/)
Однако с тех пор свойство MediaFrameSource.SupportedFormats
пусто (MediaFrameSource.SupportedFormats.Count
равно 0).
Это происходит только на моей машине, коллеги с одинаковыми машинами (с одинаковым оборудованием и программным обеспечением) и разными машинами не сталкиваются с этой проблемой.
Я сейчас работаю:
- Windows 10 Home edition
- Версия 10.0.17134 Build 17134
Я создаю приложение с Xamarin.Forms с использованием Visual Studio версии 15.9.4 .
Целевая версия приложения - Windows 10.0 Build 16299 (минимальная версия такая же).
Вот мой код от моего ViewRenderer :
var frameSourceGroups = await MediaFrameSourceGroup.FindAllAsync();
MediaFrameSourceGroup selectedGroup = null;
MediaFrameSourceInfo colorSourceInfo = null;
foreach (var sourceGroup in frameSourceGroups)
{
foreach (var sourceInfo in sourceGroup.SourceInfos)
{
if (sourceInfo.MediaStreamType == MediaStreamType.VideoRecord
&& sourceInfo.SourceKind == MediaFrameSourceKind.Color
&& sourceInfo.DeviceInformation.EnclosureLocation != null
&& sourceInfo.DeviceInformation.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front)
{
colorSourceInfo = sourceInfo;
break;
}
colorSourceInfo = sourceInfo;
}
if (colorSourceInfo != null)
{
selectedGroup = sourceGroup;
break;
}
selectedGroup = sourceGroup;
}
if (selectedGroup == null || colorSourceInfo == null) return;
_mediaCapture = new MediaCapture();
var settings = new MediaCaptureInitializationSettings()
{
SourceGroup = selectedGroup,
SharingMode = MediaCaptureSharingMode.ExclusiveControl,
MemoryPreference = MediaCaptureMemoryPreference.Cpu,
StreamingCaptureMode = StreamingCaptureMode.Video
};
try
{
await _mediaCapture.InitializeAsync(settings);
}
catch (UnauthorizedAccessException)
{
Debug.WriteLine("The app was denied access to the camera");
return;
}
catch (Exception ex)
{
Debug.WriteLine("MediaCapture initialization failed: " + ex.Message);
return;
}
Если EnableFrameServerMode не установлено в моем реестре на 0, я получаю UnauthorizedAccessException
. Если это так:
MediaFrameSource colorFrameSource = null;
foreach (var keyValuePairFrameSource in _mediaCapture.FrameSources)
{
if (keyValuePairFrameSource.Key.ToLowerInvariant().Contains(colorSourceInfo.SourceGroup.Id.ToLowerInvariant()))
{
colorFrameSource = keyValuePairFrameSource.Value;
}
}
_config = ConfigurationHelper.GetConfigData();
var preferredFormat = colorFrameSource?.SupportedFormats.FirstOrDefault(format =>
format.VideoFormat.Width == _config.CameraPreviewWidth &&
format.VideoFormat.Height == _config.CameraPreviewHeight &&
format.Subtype == MediaEncodingSubtypes.Nv12.ToUpper());
if (preferredFormat == null)
{
Debug.WriteLine("Our desired format is not supported");
return;
}
SupportedFormats
Список пуст, из-за чего наш preferredFormat
объект становится нулевым.
Если я не вернусь, когда preferredFormat
будет нулевым, и сделаю это:
var _mediaFrameReader = await _mediaCapture.CreateFrameReaderAsync(colorFrameSource, MediaEncodingSubtypes.Nv12);
_mediaFrameReader.FrameArrived += ColorFrameReader_FrameArrived;
await _mediaFrameReader.StartAsync();
У меня просто экран с черным фоном, где должны быть кадры камеры.