使用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
相关产品推荐
相关产品推荐

