Jetson Nano使用OpenCV VideoWriter无视频生成且无报错求助
问题描述
使用Jetson Nano(型号AT017-NAO-EN70)连接相机,相机画面可正常显示,但运行以下OpenCV代码录制视频时,部分设备能生成视频文件,部分设备无文件生成且控制台无任何报错。已确认相机宽高参数正确,可正常创建文本文件,更换过.avi格式与XVID编码后问题依旧,当前使用Python 3.6.9。
原测试代码:
cap = cv2.VideoCapture(2) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) fourcc = cv2.VideoWriter_fourcc(*'avc1') writer = cv2.VideoWriter('video_name.mp4', fourcc, fps, (frame_width, frame_height)) while (cap.isOpened() == True): ret, frame = cap.read() if ret == True: cv2.imshow("test", frame) writer.write(frame) if cv2.waitKey(1) & 0XFF == ord("q"): break cap.release()
解决方案与建议
显式释放VideoWriter并销毁窗口:原代码仅释放了摄像头资源,未处理VideoWriter和OpenCV窗口,导致编码缓存未写入磁盘。需在
cap.release()后添加:writer.release() cv2.destroyAllWindows()Jetson Nano的OpenCV实现中,VideoWriter的写入缓存必须通过
release()显式触发刷盘,否则进程退出时可能未完成写入,导致文件为空或不生成。检查VideoWriter初始化状态:添加初始化成功判断,避免后续无效写入:
if not writer.isOpened(): print("VideoWriter初始化失败") cap.release() exit()部分Jetson设备因硬件编码支持差异,指定的fourcc编码可能无法被系统兼容,即使无报错也会初始化失败。
使用绝对路径保存视频:部分设备可能因当前工作目录权限问题无法写入文件,尝试指定绝对路径,例如:
writer = cv2.VideoWriter('/home/nano/recordings/video_name.mp4', fourcc, fps, (frame_width, frame_height))提前确保目标目录存在且有写入权限,可通过
mkdir -p /home/nano/recordings创建目录。降低FPS或分辨率测试:部分Jetson Nano的硬件编码性能有限,若相机返回的FPS过高(如30帧)或分辨率过大,可能导致编码缓存溢出。尝试手动设置较低参数:
cap.set(cv2.CAP_PROP_FPS, 15) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # 重新获取参数 frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = int(cap.get(cv2.CAP_PROP_FPS))再初始化VideoWriter进行测试。
指定GStreamer后端:Jetson平台的OpenCV依赖GStreamer实现硬件加速,尝试显式指定VideoCapture后端:
cap = cv2.VideoCapture(2, cv2.CAP_GSTREAMER)若GStreamer组件缺失,可通过
sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-good安装。
内容的提问来源于stack exchange,提问作者Chun Wei Huang

