gpt4 book ai didi

c# - RAM获取帧的使用

转载 作者:行者123 更新时间:2023-11-30 15:33:49 24 4
gpt4 key购买 nike

我创建了一个 C# 应用程序,它在输入中接收 RGB 流,然后压缩该流并将其保存在磁盘上。对于我的测试,我正在运行一个充当服务器(在同一台电脑上)的应用程序,它流出视频。

我的客户端应用程序的核心是:

void client_ColorFrameReady(object sender, ColorFrameReadyEventArgs e)
{
if (writer != null)
{
count++;
if (count % 2 == 0)
writer.WriteVideoFrame(ResizeBitmap(BitmapImage2Bitmap(e.ColorFrame.BitmapImage), 320, 240));
}
else
{
writer.Close();
}
}
}

writer 的类型是aforge.net 库中的VideoFileWriter

我的应用程序运行良好,但我遇到了与所用 RAM 量相关的问题。

当我的应用程序获取帧时,服务器应用程序(流出视频的应用程序)使用的 RAM 随时间线性增加。只有在执行 writer.Close() 时才会释放 RAM。

BitmapImage2Bitmap 和 ResieBitmap 方法如下所示:

private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
// BitmapImage bitmapImage = new BitmapImage(new Uri("../Images/test.png", UriKind.Relative));

using (MemoryStream outStream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
enc.Save(outStream);
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream);

// return bitmap; <-- leads to problems, stream is closed/closing ...
return new Bitmap(bitmap);
}
}

private static Bitmap ResizeBitmap(Bitmap sourceBMP, int width, int height)
{
Bitmap result = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(result))
g.DrawImage(sourceBMP, 0, 0, width, height);
return result;
}

我可以在我的应用程序中限制 RAM 的使用吗?

最佳答案

I use always using

你不是。不幸的是,您也会在不应该使用它的时候使用它。每帧都有三个位图对象在此处“泄露”。

您在 MemoryStream 上使用 using 遇到了麻烦。并通过复制位图修补了问题,但位图 对象未被处理。以正确的方式解决此问题,不要处置 MemoryStream。不处理 MemoryStream 很好,当您不使用 MemoryStream(Stream) 构造函数时,它只使用内存并且没有一次性成员。现在您也不再需要使用 Bitmap(image) 构造函数制作的副本。就是一个。

BitmapImage2Bitmap() 返回的位图未被处理。那是两个。

ResizeBitmap() 返回的位图未被处理。那是三个。

它应该是这样的:

using (var frame = BitmapImage2Bitmap(e.ColorFrame.BitmapImage))                   
using (var thumb = ResizeBitmap(frame, 320, 240)) {
writer.WriteVideoFrame(thumb);
}

和:

private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage)
{
var outStream = new MemoryStream();
var enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapImage));
enc.Save(outStream);
return new System.Drawing.Bitmap(outStream);
}

正如我在评论中提到的那样,您可能仍然遇到水管问题,通过避免位图复制,此代码肯定比原始代码更快,但仍然不会燃烧橡胶。

关于c# - RAM获取帧的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16899025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com