繁体   English   中英

如何在 python 中获取带有 imageio 的视频的最后一帧?

[英]How to get the last frame of a video with imageio in python?

我想抓取均匀分布的 5 帧视频,包括第一帧和最后一帧。 对此的答案帮助我循环播放视频并获取帧。 但是我不知道如何知道它什么时候会是最后一帧。 循环播放整个视频似乎有点贵。

Python - 提取和保存视频帧

是否有更好的方法来获得 5 个特定帧(例如,每 20% 的视频)或至少和简单的方法来获得总帧数? 我已经尝试从元数据中乘以持续时间和 fps,但这些数字似乎是四舍五入的并且给出了错误的数字。

谢谢您的帮助。

这是否可能取决于您使用的容器和编解码器。 假设编解码器允许检索总帧数,您可以执行以下操作:

import imageio.v3 as iio
import numpy as np

my_video = "imageio:cockatoo.mp4"
props = iio.improps(my_video, plugin="pyav")

# Make sure the codec knows the number of frames
assert props.shape[0] != -1

for idx in np.linspace(0, props.shape[0]-1, 5, dtype=int):
    # imageIO < 2.21.0
    image = iio.imread(my_video, index=idx)
    # imageIO > 2.21.0
    # image = iio.imread(my_video, index=idx, plugin="pyav")
    iio.imwrite(f"delete_me/frame_{idx:03d}.png", image)

几点注意事项:

  • 您想使用 pyav 来调用iio.improps ,因为它不解码帧,所以速度很快。
  • 一些编解码器或容器(尤其是在流式传输视频时)要么不报告,要么不能报告其中存储的帧数。 在这种情况下props.shape[0]将为-1 ,我们不能使用这种方法。
  • 通常我也建议使用 pyav 进行imread调用,但是插件中存在一个错误,在尝试index=到最后一帧时会导致 EoF 异常。 这将由#855修复,但我不能说它是否会在这个每周版本或下一个版本中发布。
  • 如果使用的编解码器不能保证恒定的帧速率,那么与iio.imiter相比,您将不会获得任何速度优势,因为我们无法安全地预测要在视频中搜索多远。 但是,如果您知道您的视频具有恒定的帧速率,则可以使用 pyav 插件的constant_framerate kwarg 来加快速度。 (重要提示:如果视频具有可变帧率并且您设置了此值,则搜索将不准确。)
  • 像往常一样,如果您想在不每次都重新打开视频的情况下执行所有这些操作,则可以使用iio.imopen

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM