PyInstaller打包后无法保存摄像头录制视频问题求助
解决方案建议
1. 匹配实际捕获帧的尺寸
摄像头实际输出的帧分辨率可能和你指定的(640,480)不一致,导致写入的视频文件结构损坏。修改脚本,先获取摄像头的实际分辨率再初始化VideoWriter:
import cv2 import sys import os # Set up video capture video_capture = cv2.VideoCapture(1) # 获取摄像头实际输出的分辨率 frame_width = int(video_capture.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(video_capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc(*'XVID') # 使用实际分辨率初始化视频写入器 video_out = cv2.VideoWriter('output.avi', fourcc, 12.0, (frame_width, frame_height)) # Record video while True: ret, frame = video_capture.read() if not ret: break # 捕获帧失败时直接退出循环 video_out.write(frame) cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # Release resources video_out.release() video_capture.release() cv2.destroyAllWindows()
2. 让PyInstaller自动收集OpenCV依赖
手动添加dll可能存在路径处理问题,改用--collect-data cv2参数让PyInstaller自动收集所有OpenCV相关依赖文件:
pyinstaller --onefile --collect-data cv2 sample.py
打包完成后,exe所在目录会生成cv2文件夹,里面包含FFmpeg等必要依赖,确保该文件夹与exe放在同一目录下运行。
3. 使用绝对路径保存视频
打包后的exe运行时,当前工作目录可能不是exe所在目录,导致视频写入路径异常。修改保存路径为exe所在的绝对路径:
# 获取exe文件所在的绝对目录 output_dir = os.path.dirname(sys.executable) output_path = os.path.join(output_dir, 'output.avi') video_out = cv2.VideoWriter(output_path, fourcc, 12.0, (frame_width, frame_height))
4. 更换视频编码格式
尝试改用兼容性更好的编码格式,比如MJPG,部分编码在打包后可能无法正常工作:
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
注意:不同编码对应合适的文件扩展名,MJPG可搭配.avi或.mov使用。
5. 检查摄像头索引
打包后系统识别的摄像头索引可能变化,比如从1变为0,尝试修改cv2.VideoCapture(0)后重新打包测试。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

