2011-11-02 70 views
3

在Windows上,我有一个动态创建的未压缩的AVI视频文件,这会增加超时。生成视频文件的应用程序只能写入物理文件。我可以开始/停止生成视频文件并轻松删除旧视频文件。拖尾越来越多的视频文件的最后一帧

我想分析不断增长的视频文件的变化的最后一帧,以根据当前/最新图像的内容实时做出决定。如果我可以达到10fps以上,那就足够了。 无论何时在视频文件中提供新帧时,我都希望获得未压缩的图像。

作为一种文件格式,我认为png可能是这种情况下的最佳选择,但我愿意替代。 我不知道用ffmpeg或类似的工具是否可以这样做。

我更喜欢分析图像并通过使用perl + Imager模块做出决定。 Tha分析的要求并不复杂。基本上我只需要在最后一帧内的特定位置找到一些小图像的存在。 我也很感激,如果你可以建议一个有效的方式来从ffmpeg获取这些信息到我的应用程序。 例如直接输入我的代码或从保存的png文件读取。

我知道Perl已经有一个ffmpeg接口模块,但据我所知,模块不能提供我需要的功能。

+0

它看起来像你问如何(一)尾部的文件; (b)解码来自AVI的各个帧; (c)解决一个不平凡的计算机视觉问题; (d)在一个问题中使用ffmpeg API。如果你想在(c)问一个不同的问题,并提供很多细节,我会试着回答第一个和第二个问题。 – derobert

回答

1

首先,我希望你知道未压缩视频的数据速率!例如,在720x480(普通的NTSC,不是高清)和10位的16位颜色下,你每秒产生6.6兆字节。你在不到两天的时间内填入1TB硬盘。在perl中处理数据速率应该很有趣。

从文件中获取新帧应该非常简单,因为它的未压缩视频。

  1. 假设您从AVI的前端开始(例如,您开始捕获并处理)。
  2. 请阅读AVI标头,确保其符合预期(例如正确的格式)。
  3. 请注意当前亚秒系统时间戳(例如,来自Time :: HiRes)。
  4. 你知道单个帧的长度。尝试sysread吧。继续尝试,直到获得完整帧(当然,每次更新所需的长度),或者获得EOF(sysread返回0)。
  5. 如果您在全画面之前得到EOF:睡眠一小段时间(比如说,10ms,Time::HiRes会让您睡眠时间少于1秒),然后尝试再次读取框架的其余部分。 sysread不需要EOF指示重置;它会在你每次打电话时再试一次。继续执行延迟/系统读取循环,直到您有全帧。
  6. 你现在有一个完整的框架。由于它是未压缩的视频,因此在将其传递到计算机视觉代码之前,实际上不需要太多解码。 (你可能需要交换字节,或者从16位转换为32位,但没有比这更糟的)。
  7. 由于您正在阅读10fps视频,因此在下一帧之前的1/10秒的剩余时间内休眠。
  8. 回到(3)。

您可能会发现,如果您使用库来实现您的计算机视觉,它具有帮助解决这个问题的功能 - 例如,,它可能能够从AVI文件中读取帧。例如,OpenCV可以。