使用OpenCV的VideoWriter生成的MP4文件无法播放求助
解决OpenCV VideoWriter生成MP4无法播放的问题
你遇到的问题是录制的MP4文件无法播放,但预览窗口显示正常,核心原因有三个:图像通道不兼容、视频尺寸不匹配、未正确释放写入器资源,以下是具体修复步骤:
问题1:图像通道不匹配
WindowCapture.get_screenshot()返回的是4通道BGRA格式图像(带Alpha透明通道),但OpenCV的VideoWriter默认只支持3通道BGR格式,直接写入会导致文件编码异常。
修复:在写入前把图像转换为3通道BGR:
screenshot = cv.cvtColor(screenshot, cv.COLOR_BGRA2BGR)
问题2:VideoWriter尺寸硬编码
你初始化VideoWriter时用了固定尺寸(800, 600),但实际截取的游戏窗口尺寸是(self.w, self.h),两者不匹配会导致编码失败。
修复:用实际窗口的宽高初始化VideoWriter:
captured_video = cv.VideoWriter(file_name, fourcc, 60.0, (wincap.w, wincap.h))
问题3:未释放VideoWriter资源
程序结束时没有调用captured_video.release(),导致视频文件的索引信息未写入,播放器无法识别文件结构。
修复:在循环结束后添加释放代码:
captured_video.release()
修改后的完整main.py代码
import cv2 as cv import numpy as np from time import time import datetime from windowcapture import WindowCapture wincap = WindowCapture('Geometry Dash') time_stamp = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S') fourcc = cv.VideoWriter_fourcc('m', 'p', '4', 'v') file_name = f'{time_stamp}.mp4' # 使用实际窗口尺寸初始化VideoWriter captured_video = cv.VideoWriter(file_name, fourcc, 60.0, (wincap.w, wincap.h)) loop_time = time() while True: screenshot = wincap.get_screenshot() # 转换为3通道BGR格式 screenshot = cv.cvtColor(screenshot, cv.COLOR_BGRA2BGR) # 打印FPS print('FPS {:.2f}'.format(1 / (time() - loop_time))) loop_time = time() cv.imshow('Screen Capture', screenshot) captured_video.write(screenshot) # 按q退出 if cv.waitKey(1) == ord('q'): cv.destroyAllWindows() break # 释放VideoWriter资源 captured_video.release() print('q pressed // window closing')
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

