C # MediaCapture UnuthorizedAccessException или нет поддерживаемых форматов после Windows Update - PullRequest
0 голосов
/ 17 января 2019

Каждый раз, когда я выполнял обновление на своем компьютере с 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();

У меня просто экран с черным фоном, где должны быть кадры камеры.

1 Ответ

0 голосов
/ 18 января 2019

Это происходит только на моей машине, коллеги с одинаковыми машинами (с одинаковым аппаратным и программным обеспечением) и разными машинами не сталкиваются с этой проблемой.

Я проверил ваш код, и он похож на CameraFrames официальный пример кода. У меня есть тест с LifeCam HD-3000 , и он хорошо работает (без изменения реестра). Я думаю, что очень вероятно, что есть проблема с вашим аппаратным устройством. Я думаю, вы могли бы использовать другие камеры для устранения неполадок. Для использования камеры вы также можете проверить этот образец .

...