You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:46