我需要在 RAM 中存储五分钟的流数据(或者,如果有的话,也可以存储另一种数据。现在我只知道 RAM )。
我知道如何使用Marshal.copy
但是每个帧的大小约为3Mb,对于 RAM 而言,它太大了。
我相信,如果我只是将字节存储在数组中,那么数据的大小可能会小得多,但我不知道如何做。目前,整个元帅的事情还不太清楚,寻找将指针值复制到托管数组的方法的日子是徒劳的。 我需要帮助。
我想念什么? 为什么我不能复制可用于存储为BMP的块(作为简单的字节数组)? 如何将以下函数转换为返回数组的函数?
这是我用来将数据转换为BMP的代码,我需要进行必要的更改以将其转换为收集所有数据的函数,就像列表或数组一样。
private Bitmap GetBitmap(ISampleGrabber i_grabber, int width, int height, int stride)
{
int sz = 0;
i_grabber.GetCurrentBuffer(ref sz, IntPtr.Zero);
if (sz == 0) return null;
var ptr = Marshal.AllocCoTaskMem(sz);
i_grabber.GetCurrentBuffer(ref sz, ptr);
var data = new byte[sz];
Marshal.Copy(ptr, data, 0, sz);
Bitmap result = null;
try
{
result = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
var bmp_data = result.LockBits(new Rectangle(Point.Empty, result.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
for (int y = 0; y < height; y++)
{
var src_idx = sz - (stride * (y + 1));
//Console.WriteLine(src_idx);
var dst = new IntPtr(bmp_data.Scan0.ToInt32() + (stride * y));
Marshal.Copy(data, src_idx, dst, stride);
}
result.UnlockBits(bmp_data);
Marshal.FreeCoTaskMem(ptr);
}
catch (ArgumentException ax)
{
//System.Windows.Forms.MessageBox.Show(ax.Message);
Console.WriteLine(ax.Message);
}
return result;
}
答案 0 :(得分:0)
每帧3 MB,300秒和每秒N帧可能会使RAM太大。随着视频捕获的进行,您必须对数据进行处理。
一些适合您的想法:
1.1。硬件辅助压缩(需要GPU,在某些情况下可能是无损的);输出将适合RAM和磁盘写入
1.2。具有已知格式的软件压缩(高CPU负载);数据将适合RAM
1.3。使用简单的众所周知的算法进行的一些轻量级压缩可能是无损的;根据内容,即使是简单的后处理也很有可能会减少要保留的数据量