拖尾不断增长的视频文件的最后一帧

时间:2011-11-02 16:38:07

标签: perl video image-processing ffmpeg

在Windows上,我有一个动态创建的未压缩avi视频文件,它会随着时间的推移而增长。生成视频文件的应用程序只能写入物理文件。我可以开始/停止生成视频文件并轻松删除旧的视频文件。

我想分析不断增长的视频文件的最后一帧,以便根据当前/最新图像的实时内容做出决定。如果我能达到10fps以上就足够了。 每当视频文件中有新的帧时,我想获得未压缩的图像。

作为一种文件格式,我认为png可能是这种情况下的最佳选择,但我对替代方案持开放态度。 我想知道ffmpeg或类似的工具是否可以做到这一点。

我更喜欢使用perl + Imager模块分析图像并做出决定。 Tha分析要求并不复杂。基本上我只需要在最后一帧内的某些位置找到一些小图像。 如果您能建议一种有效的方法从ffmpeg将此信息输入我的应用程序,我将不胜感激。 例如,直接连接到我的代码或从已保存的png文件中读取。

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

1 个答案:

答案 0 :(得分:1)

首先,我希望你能实现未压缩视频的数据速率!例如,在720x480(普通的'OLTS,而不是HD),16位色,10fps,你每秒产生6.6兆字节。您在不到两天的时间内填写1TB硬盘。处理perl中的数据速率应该很有趣。

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

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