【问题标题】:Recording video/Image information in C# file size is huge以 C# 文件大小录制视频/图像信息是巨大的
【发布时间】:2013-02-11 01:21:19
【问题描述】:

我正在使用 MS Kinect 来记录和回放颜色、深度和骨架输出。 我正在使用BinaryWriter 将此信息写入文件。该过程运行良好,但文件大小在短时间内变得巨大(5 分钟内约 15 GB)。自然地,当调用“重播此信息”时,加载此大小的文件需要一段时间才能开始播放。而需要是能够记录大约1小时的输出。按照这个速度,到录制结束时文件将是 180 GB,我猜这将太多而无法加载和开始即时播放。

一种可能的解决方案是检测文件大小何时达到 1 GB,然后创建另一个文件并不断重复此过程。这样我最终会得到几个 1 GB 的文件来录制 1 小时。对于重播,我将一一加载它们。

在开始执行此操作之前,我必须记住 Kinect 输出会不断流入。因此,创建新文件可能会花费大量时间开销。

问题:

  1. .NET 中现有的文件写入 API 是否提供了一种自动检测文件大小和创建另一个文件等的方法?

  2. 每隔几秒创建新文件是否会产生很大的开销?由于我希望记录的信息以每秒 30 帧的速度流入,这可能意味着在创建文件时会丢失一些信息等等。


我认为我需要高精度作为研究应用。我刚刚做了另一个测试 30 分钟的深度,色彩捕捉以接近 98 Gb 的文件结束。 使用此代码(来自 Kinect.Toolbox)需要永远播放 - {

 while (reader.BaseStream.Position != reader.BaseStream.Length)
        {
            KinectRecordOptions header = (KinectRecordOptions)reader.ReadInt32();
            switch (header)
            {
                case KinectRecordOptions.Color:
                    colorReplay.AddFrame(reader);
                    break;
                case KinectRecordOptions.Depth:
                    depthReplay.AddFrame(reader);
                    break;
                case KinectRecordOptions.Skeletons:
                    skeletonReplay.AddFrame(reader);
                    break;
            }
        }

}

【问题讨论】:

  • 您如何访问该文件?打开文件并开始读取文件的性能不应取决于文件大小。
  • 你想播放什么?只是骨骼的视觉表示? 2D/3D?还是只是图像?
  • 我正在尝试播放的是深度和彩色图像。
  • Daniel 我认为在用户界面上显示深度和颜色帧方面 - 读取大文件确实很重要。 " while (reader.BaseStream.Position != reader.BaseStream.Length) "

标签: c# file io kinect


【解决方案1】:

如果您不需要高精确度,您可以降低采样率,以便您仍然有足够的 fps 来支持您将用更小的文件大小重播它们。
Kinect 会捕获大量信息,因此最好准确定位您想要播放的内容并仅保存这些信息。

【讨论】:

  • 我在写的时候确实把文件分成了块。性能还不错,但是我认为这样会丢失一些数据 - 我可能会通过构建基于缓冲/队列的解决方案来即兴发挥它来保留所有帧。
  • 我还打算让来自 Kinect 的一些信息消失(就像永远不要将其写入文件一样)。如果您只是在播放而不是实时操作,那么您应该在 40-60fps 下具有足够的精度。无论哪种方式,我都很高兴它有所帮助,而且您的缓冲区/队列想法听起来不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
相关资源
最近更新 更多