使用moviepy从图像数组导出视频时播放帧率过高如何解决
问题根源
你调用clip.get_frame(t)时传入的参数t是以秒为单位的时间值,不是帧的索引序号。你当前直接把循环变量i(帧序号)作为t传入,相当于每间隔1秒才取1帧,实际取出的帧对应的时间跨度远大于原视频时长,最终用30fps写入时,这些帧会被压缩在总帧数/30的时长里播放,自然速度会异常变快。
修复方案
方案1:修正取帧的时间计算
将取帧行的参数改为帧序号除以原视频fps,获取对应帧的正确时间点:
from moviepy.editor import * # read video path = "path/to/video.mp4" clip = VideoFileClip(path) fps = clip.fps # get video as an array of images: nframes = clip.reader.nframes frames = [] for i in range(nframes): # 修正:第i帧对应的时间点为 i/fps 秒 frames.append(clip.get_frame(i / fps)) # save video save_path = "save/path/video.mp4" clip = ImageSequenceClip(frames, fps=fps) clip.write_videofile(save_path)
方案2:使用内置方法直接取所有帧(更推荐)
moviepy已经提供了直接迭代所有帧的iter_frames()方法,不需要手动计算时间和索引,避免出错:
from moviepy.editor import * path = "path/to/video.mp4" clip = VideoFileClip(path) fps = clip.fps # 一行代码获取所有帧的数组 frames = list(clip.iter_frames()) save_path = "save/path/video.mp4" clip = ImageSequenceClip(frames, fps=fps) clip.write_videofile(save_path)
补充说明
如果你的原视频是可变帧率(VFR)视频,clip.reader.nframes的取值可能不准确,用iter_frames()方法可以自动适配这种情况,不会出现丢帧或者重复帧的问题。
内容的提问来源于stack exchange,提问作者phileasdg
相关产品推荐
相关产品推荐

