gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:43:15 24 4
gpt4 key购买 nike

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

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

作为一种文件格式,我认为 png 在这种情况下可能是最好的选择,但我对其他选择持开放态度。我想知道使用 ffmpeg 或类似工具是否可以实现这样的事情。

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

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

最佳答案

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

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

  1. 假设您从 AVI 的前面开始(例如,您开始捕获和处理)。
  2. 阅读 AVI header ,确保它符合预期(例如,格式正确)。
  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 就可以。

关于perl - 拖尾不断增长的视频文件的最后一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7983966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com