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

使用Python ctypes调用Windows原生API捕获摄像头异常

解决Windows API摄像头快照生成空文件问题

问题分析

你的代码已成功连接摄像头(LED亮起),但生成空文件且返回False,核心原因有两个:

  1. 字符集不匹配:使用宽字符版本的capCreateCaptureWindowW,但发送消息时用了ANSI版本的SendMessageA,导致字符串参数(如文件路径)传递错误,消息处理逻辑不兼容。
  2. 未捕获帧数据:直接调用WM_CAP_FILE_SAVEDIB时,摄像头还未捕获到有效帧,因此保存的是空文件。

修正后的代码

import ctypes
from ctypes import wintypes

def CaptureWebcam(index: int, filePath: str) -> bool:
    avicap32 = ctypes.windll.avicap32
    user32 = ctypes.windll.user32

    # 窗口样式常量
    WS_CHILD = 0x40000000
    WS_VISIBLE = 0x10000000

    # 摄像头消息常量
    WM_CAP_DRIVER_CONNECT = 0x0400 + 10
    WM_CAP_DRIVER_DISCONNECT = 0x0402
    WM_CAP_GRAB_FRAME_NOSTOP = 0x0400 + 61  # 捕获帧且不停止预览
    WM_CAP_FILE_SAVEDIB = 0x0400 + 100 + 25

    # 创建宽字符版本的捕获窗口
    hcam = avicap32.capCreateCaptureWindowW(
        wintypes.LPWSTR("CaptureWindow"),
        WS_CHILD | WS_VISIBLE,  # 添加WS_VISIBLE确保窗口正常初始化
        0, 0, 0, 0,
        user32.GetDesktopWindow(),
        0
    )

    result = False

    if hcam:
        # 使用SendMessageW匹配宽字符窗口
        if user32.SendMessageW(hcam, WM_CAP_DRIVER_CONNECT, index, 0):
            # 先捕获一帧数据到缓冲区
            if user32.SendMessageW(hcam, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0):
                # 保存捕获的帧为DIB文件
                if user32.SendMessageW(hcam, WM_CAP_FILE_SAVEDIB, 0, wintypes.LPWSTR(filePath)):
                    result = True
            # 断开驱动连接
            user32.SendMessageW(hcam, WM_CAP_DRIVER_DISCONNECT, 0, 0)
        # 销毁窗口
        user32.DestroyWindow(hcam)
    
    return result

关键改动说明

  • 统一字符集:将所有SendMessageA替换为SendMessageW,与capCreateCaptureWindowW的宽字符版本匹配,避免字符串参数传递错误。
  • 添加帧捕获步骤:在保存文件前调用WM_CAP_GRAB_FRAME_NOSTOP,强制摄像头捕获当前帧并存储到缓冲区,确保保存时有有效数据。
  • 调整窗口样式:添加WS_VISIBLE样式,部分摄像头驱动需要可见窗口才能正常初始化帧捕获逻辑。
  • 简化API引用:将ctypes.windll.user32赋值给变量user32,提升代码可读性。

测试建议

  1. 使用绝对文件路径(如C:\\test\\snapshot.bmp),避免相对路径导致的保存失败。
  2. 若存在多个摄像头,尝试调整index参数(从0开始),确认目标摄像头索引正确。

内容的提问来源于stack exchange,提问作者LuckyCoder3607

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:05:00