自从我在Windows计算机上进行了更新以来,我再也无法在使用MediaCapture
类的UWP应用程序中使用相机。
本来,我在尝试调用UnuthorizedAccessException
函数时遇到了InitializeAsync()
的问题,但是,我设法通过在我的寄存器中添加 EnableFrameServerMode 来解决此问题(通过此链接) :https://www.macecraft.com/fix-webcam-issues-windows-10-anniversary-update/)
但是,由于这样做,MediaFrameSource.SupportedFormats
属性为空(MediaFrameSource.SupportedFormats.Count
为0)。
这仅发生在我的计算机上,具有相同计算机(相同硬件和软件)且不同计算机的同事没有遇到此问题。
我当前正在运行:
我正在使用 Visual Studio 15.9.4 版本的 Xamarin.Forms 构建应用程序。 该应用程序的目标版本为 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
为null时我不返回,请执行以下操作:
var _mediaFrameReader = await _mediaCapture.CreateFrameReaderAsync(colorFrameSource, MediaEncodingSubtypes.Nv12);
_mediaFrameReader.FrameArrived += ColorFrameReader_FrameArrived;
await _mediaFrameReader.StartAsync();
我刚得到一个黑色背景的屏幕,应该是相机框架。
答案 0 :(得分:0)
这仅发生在我的计算机上,具有相同计算机(相同硬件和软件)且不同计算机的同事没有遇到此问题。
我检查了您的代码,它类似于CameraFrames
官方代码示例。我已经对 LifeCam HD-3000 进行了测试,并且效果很好(无需修改注册表)。我认为您的硬件设备很可能有问题。我认为您可以使用其他相机故障排除。要使用相机,您还可以选中此sample。