【问题标题】:Tailing last frame of a growing video file拖尾不断增长的视频文件的最后一帧
【发布时间】:2011-12-20 12:03:54
【问题描述】:

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

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

作为一种文件格式,我认为在这种情况下 png 可能是最好的选择,但我愿意接受其他选择。 我想知道使用 ffmpeg 或类似工具是否可以做到这一点。

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

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

【问题讨论】:

  • 看起来你在问如何(a)尾随文件; (b) 从 AVI 解码单个帧; (c) 解决一个重要的计算机视觉问题; (d) 在一个问题中使用 ffmpeg API。如果您在 (c) 方面需要帮助,我将尝试回答第一个和第二个问题,请提出一个不同的问题,并提供很多详细信息。

标签: perl video image-processing ffmpeg


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多