OpenCV录屏生成仅6KB视频文件问题求助
解决OpenCV录制Windows屏幕生成6KB空视频的问题
我之前也踩过几乎一模一样的坑,6KB的视频基本都是视频写入器未正确释放资源或者帧格式不兼容导致的,结合你的代码和情况,给你几个针对性的解决方案:
1. 核心问题:缺少VideoWriter的资源释放
你的代码里,线程循环结束后完全没调用vid.release()——这会导致OpenCV无法把视频的索引、收尾数据写入文件,最终只生成一个空的文件头(就是你看到的6KB)。再加上主线程在stopThread()结束后直接退出,录制线程可能还没来得及收尾就被强制终止了。
修改startThread函数,补上释放操作,同时修正帧格式:
def startThread(running): fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') vid = cv2.VideoWriter('record.avi', fourcc, 30, (960, 720)) while running.is_set(): img = ImageGrab.grab() # 关键:ImageGrab返回RGB格式,OpenCV的VideoWriter需要BGR格式 img_np = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # 额外检查:如果抓取的图像尺寸和设置不匹配,写入会失败 if img_np.shape[:2] == (720, 960): vid.write(img_np) else: print(f"图像尺寸不匹配:{img_np.shape[:2]},预期(720,960)") # 必须添加这行,释放资源并写入文件收尾 vid.release() print("视频写入完成,已释放资源")
2. 修复线程同步问题
你的主线程在调用stopThread()后,没有等待录制线程完成就直接退出了,这会导致vid.release()根本没机会执行。修改主函数,确保等待线程完全结束:
if __name__ == "__main__": running = threading.Event() thread = threading.Thread(target=startThread, args=(running,)) running.set() thread.start() # 等待10秒后停止录制 time.sleep(10) running.clear() # 等待录制线程执行完所有收尾操作 thread.join() print("程序结束")
3. 验证分辨率匹配
如果你的屏幕分辨率不是960x720,ImageGrab.grab()得到的图像尺寸会和VideoWriter设置的不一致,导致帧完全写不进去。可以先打印抓取的尺寸,再对应调整:
img = ImageGrab.grab() print(f"抓取的图像尺寸:{img.size}") # 输出为(width, height) # 让VideoWriter的尺寸和抓取的一致 vid = cv2.VideoWriter('record.avi', fourcc, 30, img.size)
4. 额外排查点(针对你提到的ffmpeg问题)
虽然你同事的配置能跑,但还是可以快速确认:
- 用
print(cv2.getBuildInformation())查看OpenCV编译信息,找FFmpeg那一行是否显示YES,确保你的OpenCV带ffmpeg支持 - 尝试更换fourcc编码,比如
cv2.VideoWriter_fourcc(*'MP4V')或cv2.VideoWriter_fourcc(*'MJPG'),有些编码在特定环境下兼容性更好
按上面的步骤修改后,应该就能生成正常大小的视频文件了——我当初就是因为忘了加release()和格式转换,折腾了大半天😅
内容的提问来源于stack exchange,提问作者sKen
相关产品推荐
相关产品推荐

