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

使用MoviePy保存视频与CSV时的时长不匹配及CSV缺失问题

问题排查与解决方案

一、视频时长和CSV记录不匹配

可能的原因及修复方式

  • 帧收集不全:处理循环里可能有部分帧没加到frames_to_video列表里。检查循环逻辑,确保每处理完一帧就执行frames_to_video.append(处理后的帧),别因为状态检测的条件判断跳过帧的添加。
  • 帧率real_fps不准确:如果real_fps是手动写死的,不是从原视频/摄像头获取的真实帧率,生成视频的时长肯定不对。建议从原视频流里读取真实帧率:
    # 处理本地视频时获取原帧率
    from moviepy.editor import VideoFileClip
    original_clip = VideoFileClip("你的输入视频路径")
    real_fps = original_clip.fps
    
  • 帧尺寸不一致:MoviePy的ImageSequenceClip如果遇到尺寸不统一的帧,会自动丢帧。所有要加入列表的帧,统一转成相同分辨率:
    import cv2
    # 比如设成原视频的宽高
    target_size = (1280, 720)
    processed_frame = cv2.resize(frame, target_size)
    frames_to_video.append(processed_frame)
    
  • 循环终止不同步:要是处理循环提前结束了(比如摄像头读不到帧就退出),但CSV还在记录后续时间戳,就会出现时长差。得保证循环终止时,帧收集和CSV记录的时间线完全对齐。

二、CSV末尾总结行不显示

可能的原因及修复方式

  • 文件句柄嵌套导致写入失效:你现在在初始化CSV的with块里又套了一个追加的with块,容易出现缓存没刷新、写入被覆盖的问题。直接用同一个文件句柄写完数据再写总结行:
    with open(csv_filename, mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(['Timestamp', 'Cansado', 'Dormindo', 'Olhando Fora', 'Distraído', 'Bocejando'])
        
        # 这里放处理循环,逐行写入每帧的状态数据
        
        # 直接在这里写总结行,不用重新打开文件
        writer.writerow(['Resumo', f"Cansado: {tired_duration}s", f"Dormindo: {sleep_duration}s", ...])
    
  • 总结行代码没执行到:处理循环如果中途抛异常,后面的总结行代码就跑不了。给循环加个异常捕获,确保总结行无论如何都能执行:
    with open(csv_filename, mode='w', newline='') as file:
        writer = csv.writer(file)
        writer.writerow(...)
        try:
            # 处理循环逻辑
        except Exception as e:
            print(f"处理出错: {e}")
        finally:
            # 不管循环正常结束还是出错,都写总结行
            writer.writerow(['Resumo', ...])
    
  • 追加模式的权限问题:初始化文件的with块关闭后,再打开追加可能遇到文件被占用的情况,合并成一个文件句柄操作就能避免。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:50:12