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

使用Python结合cv2实现视频顺序播放列表时多视频同播问题求解

代码修改方案及问题说明

原代码核心问题

  • 无帧率控制逻辑:cv2不会自动匹配视频原生帧率播放,read()调用速度越快播放速度越快,单段视频可能几十毫秒就播完立刻切下一段,视觉上会误认为多个视频同时运行
  • 索引逻辑错误:for i in range(3) 内部执行i += 1会跳过索引为0的视频,且如果播放列表总长度小于4会触发索引越界报错
  • 重复调用cv2.imshow,冗余逻辑容易导致渲染异常
  • 按下q键仅退出当前视频的内层循环,没有终止外层播放列表循环,会立刻加载下一段视频,看起来像是同时存在多个窗口
  • 随机打乱播放列表后使用固定的range(3)遍历,仅会播放前3个视频,不会遍历所有mp4文件

修复后可实现顺序逐帧播放的代码

import cv2
import os
import random

videofolderPath = '/folderwithfiles'
playlist = []
for file in os.listdir(videofolderPath):
    if file.lower().endswith(".mp4"):
        path = os.path.join(videofolderPath, file)
        playlist.append(path)

# 不需要随机播放可以注释掉下面这行
random.shuffle(playlist)

# 遍历整个播放列表,不需要固定range(3)
for video_path in playlist:
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        print(f"无法打开视频:{video_path}")
        continue
    
    print(f"当前播放:{video_path}")
    # ========== 视频开始,在此处添加触发TTL开始脉冲的代码 ==========
    
    # 获取视频原生帧率,用于控制播放速度
    fps = cap.get(cv2.CAP_PROP_FPS)
    # 每帧停留的毫秒数,留1ms余量给按键检测
    frame_delay = int(1000 / fps) - 1 if fps > 0 else 25

    while True:
        ret, frame = cap.read()
        # 帧读取失败说明视频播完了
        if not ret:
            break
        
        cv2.imshow('frame', frame)
        # 按帧率停留,检测按键
        key = cv2.waitKey(frame_delay) & 0xFF
        if key == ord('q'):
            # 按下q直接释放资源,退出所有循环
            cap.release()
            cv2.destroyAllWindows()
            # 直接终止整个程序,不再播放后续视频
            exit()
    
    # ========== 视频结束,在此处添加触发TTL结束脉冲的代码 ==========
    cap.release()
    # 每段视频播完销毁窗口,避免残留
    cv2.destroyAllWindows()

# 所有视频播完后销毁所有窗口
cv2.destroyAllWindows()

功能说明

  • 自动按视频原生帧率逐段播放,播放完一段自动加载下一段
  • 按下q键直接退出整个程序,不会继续加载后续视频
  • 预留了视频首尾的TTL触发代码位置,直接在对应位置添加你的脉冲触发逻辑即可
  • 自动跳过无法打开的损坏视频文件
  • 默认遍历文件夹内所有mp4文件播放,不需要的话可以自行修改遍历逻辑

内容的提问来源于stack exchange,提问作者PillowTalk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:27:04