You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:09:01