Я использую класс BitmapEncoder
для преобразования захваченного видеофрагмента камеры в поток. Когда это делается в цикле с помощью DispatcherTimer, мое приложение постепенно теряет память, но не восстанавливает ее.BitmapEncoder MemoryLeak с SoftwareBitmap
Я использовал this Microsoft образец как основа.
Фактический код, который протекает.
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
using (var videoFrame = new VideoFrame(BitmapPixelFormat.Rgba16, (int)previewProperties.Width, (int)previewProperties.Height))
{
using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
{
using (var currentFrame = await _mediaCapture.GetPreviewFrameAsync(videoFrame))
{
// Collect the resulting frame
using (SoftwareBitmap previewFrame = currentFrame.SoftwareBitmap)
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
//MEMORY LEAK
encoder.SetSoftwareBitmap(previewFrame);
await encoder.FlushAsync();
//DO something with the stream
}
}
}
}
В чем вопрос? –
Как предотвратить Memoryleak, конечно, – Freggar
@Freggar: У вас нет доказательств утечки памяти. По крайней мере, попробуйте принудительно принудительно выполнить GC.Collect и waitForFinalization, чтобы узнать, есть ли релиз памяти. Имейте в виду, что приложения .net запускают сборщик мусора и освобождают память только при наличии давления памяти. – CharithJ