У меня есть код, основанный на этом образце; https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/CameraGetPreviewFrame. Каждый раз, когда линия;
await _mediaCapture.GetPreviewFrameAsync(_currentVideoFrame);
удар, мы, кажется, утечка памяти. Что я не убираю? Я также пытался каждый раз создавать рамку шаблона, располагать и обнулять его в каждом цикле - похоже, это тоже не работает.
Я вернулся к исходному образцу от Microsoft, и, похоже, он тоже протекает. Вот мой код;
await Task.Run(async () =>
{
try
{
var videoEncodingProperties =
_mediaCapture.VideoDeviceController.GetMediaStreamProperties
(MediaStreamType.VideoPreview) as VideoEncodingProperties;
Debug.Assert(videoEncodingProperties != null, nameof(videoEncodingProperties) + " != null");
_currentVideoFrame = new VideoFrame(BitmapPixelFormat.Gray8,
(int) videoEncodingProperties.Width,
(int) videoEncodingProperties.Height);
TimeSpan? lastFrameTime = null;
while (_mediaCapture.CameraStreamState == CameraStreamState.Streaming)
{
token.ThrowIfCancellationRequested();
await _mediaCapture.GetPreviewFrameAsync(_currentVideoFrame);
if (!lastFrameTime.HasValue ||
lastFrameTime != _currentVideoFrame.RelativeTime)
{
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync
(CoreDispatcherPriority.Normal,
() =>
{
try
{
Debug.Assert(_currentVideoFrame != null,
$"{nameof(_currentVideoFrame)} != null");
var bitmap = _currentVideoFrame.SoftwareBitmap.AsBitmap();
float focalLength = _cameraOptions == CameraOptions.Front ? AppSettings.FrontCameraFocalLength : AppSettings.RearCameraFocalLength;
_frameProcessor.ProcessFrame(bitmap, focalLength);
}
catch (Exception ex)
{
Debug.WriteLine($"Exception: {ex}");
}
});
lastFrameTime = _currentVideoFrame.RelativeTime;
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Exception: {ex}");
}
},
token);
Это должно просто получить кадры и поместить их через вызов _frameProcessor.ProcessFrame()
, но даже когда это ничего не делает (а я вырезал все, кроме GetPreviewFrameAsync), оно протекает.
Чтобы повторить проблему, скачайте образец с; https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/CameraGetPreviewFrame. Запустите образец в отладчике с помощью диагностических инструментов (Debug-> Windows-> Show Diagnostic tools) удаленно на Surface Pro 4 (i5-6300U @ 2,4 ГГц) под Windows 10 v 1903 (18362.175). Установите флажок «Показать кадр» и наблюдайте за памятью при нажатии кнопки GetPreviewFrameAsync. Память выглядит следующим образом, где каждый раз, когда я нажимаю кнопку;
![Memory Leak](https://i.stack.imgur.com/pTc7m.png)