Сбой MediaCapture Effect: «Недостаточно ресурсов памяти для выполнения этой операции». - PullRequest
0 голосов
/ 09 октября 2019

Я использую класс MediaCapture (Windows.Media.Capture), чтобы добавить некоторые эффекты к входным кадрам веб-камеры. Для применения эффектов я работаю с библиотекой Win2D . После того, как я несколько раз очищаю и повторно применяю эффекты, подобные приведенному ниже, возникает исключение, и веб-камера не работает.

Событие MediaCapture Failed показывает следующие аргументы:

MediaCaptureFailedEventArgs
Code : 2147942414
Message : "Not enough memory resources are available to complete this operation."

Однако счетчик производительности в диспетчере задач показывает достаточный объем памяти для использования.

//Reset Effect Method
private async Task ApplyAllEffects()
{
  await ClearAllEffects();
  await ApplyRemoveGreenEffect();
}

//Clear All Effects Method
private async Task ClearAllEffects()
{
  //_previewMediaCapture is a MediaCapture object
  if (_previewMediaCapture == null) return;
  await _previewMediaCapture.ClearEffectsAsync(MediaStreamType.VideoPreview);
}

//Add Effect Method
private async Task ApplyRemoveGreenEffect()
{
  if (_previewMediaCapture == null) return;

  var properties = new PropertySet();
  properties[nameof(RemoveGreenMediaExtension.Value)] = (float)Preferences.RemoveGreen;

  var definition = new VideoEffectDefinition(typeof(RemoveGreenVideoEffect).FullName, properties);

  await _previewMediaCapture.AddVideoEffectAsync(definition, MediaStreamType.VideoPreview);
}

Я проверил программу и код Образец Win2d , предлагаемый MS. У него тоже такая же проблема. Нет способа избежать этой проблемы?

1 Ответ

0 голосов
/ 16 октября 2019

Я могу догадаться, почему это произошло.

Прежде чем инициализировать объект MediaCapture и применить к нему эффекты Win2D, я использовал кодек MJPG для камер, вызвав MediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync (...) метод.

Он поддерживается моей веб-камерой (Logitech C920) для 30 кадров в секунду в 1080p. Это вызвало утечки памяти GPU. Когда я использую необработанный (YUV) кодек или кодек NV12 для входных кадров, утечка памяти графического процессора не происходит.

Я думаю, что процесс кодирования MJPG добавляется к графическому конвейеру кулачка и по некоторым причинам, чтотрубопровод не может быть освобожден должным образом.

...