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

使用Python cv2进行视频帧拆分合成时的帧顺序异常问题求助

问题根源

你遇到的帧顺序错乱问题,是因为os.listdir()返回的文件名采用字典序排序。比如文件名frame10.jpg会排在frame2.jpg前面——字符串比较时,"1"的ASCII码小于"2",导致本该靠后的帧被提前写入视频。

修复方法

修改图片列表的排序逻辑,提取文件名中的数字部分,按数字大小升序排列,确保帧的顺序和拆分时完全一致。

修改后的完整代码
import os
import cv2
import re  # 用于提取文件名中的数字

# 视频文件路径设置
video_path = "video.mp4"

# 打开视频文件
cap = cv2.VideoCapture(video_path)

# 获取原视频FPS,避免硬编码导致播放速度不一致
fps = cap.get(cv2.CAP_PROP_FPS)
# 获取视频总帧数
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# 图片保存路径设置
save_path = "image_data"
# 确保保存目录存在,不存在则创建
os.makedirs(save_path, exist_ok=True)

# 按帧拆分并保存图片
for i in range(frame_count):
    ret, frame = cap.read()
    if ret:
        cv2.imwrite(f"{save_path}/frame{i}.jpg", frame)
    else:
        break

cap.release()

# 读取保存的图片文件
image_folder = 'image_data'
# 提取文件名中的数字,按数字大小升序排序
images = sorted(
    [img for img in os.listdir(image_folder) if img.endswith('.jpg')],
    key=lambda x: int(re.findall(r'\d+', x)[0])
)

# 获取单帧图片的尺寸信息
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape

# 设置视频编码器
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
# 创建视频写入对象
video = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))

# 将图片逐帧写入合成视频
for image in images:
    video.write(cv2.imread(os.path.join(image_folder, image)))

# 释放资源
cv2.destroyAllWindows()
video.release()
额外优化点
  • 新增os.makedirs(save_path, exist_ok=True),避免因保存目录不存在导致报错
  • 改用原视频的FPS参数,而非硬编码24,保证合成视频的播放速度与原视频一致
  • 使用f-string格式化文件路径,代码更简洁易读

内容的提问来源于stack exchange,提问作者최지훈

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:52:57