[英]How to get the last frame of a video with imageio in python?
我想抓取均匀分布的 5 帧视频,包括第一帧和最后一帧。 对此的答案帮助我循环播放视频并获取帧。 但是我不知道如何知道它什么时候会是最后一帧。 循环播放整个视频似乎有点贵。
是否有更好的方法来获得 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)
几点注意事项:
iio.improps
,因为它不解码帧,所以速度很快。props.shape[0]
将为-1
,我们不能使用这种方法。imread
调用,但是插件中存在一个错误,在尝试index=
到最后一帧时会导致 EoF 异常。 这将由#855修复,但我不能说它是否会在这个每周版本或下一个版本中发布。iio.imiter
相比,您将不会获得任何速度优势,因为我们无法安全地预测要在视频中搜索多远。 但是,如果您知道您的视频具有恒定的帧速率,则可以使用 pyav 插件的constant_framerate
kwarg 来加快速度。 (重要提示:如果视频具有可变帧率并且您设置了此值,则搜索将不准确。)iio.imopen
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.