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

Python OpenCV录屏遇Fourcc编解码器错误,求解决方案

问题描述

运行录制摄像头的Python脚本时出现如下警告:

OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'

同时录制出的MP4文件无法播放,原代码如下:

import cv2

cam = cv2.VideoCapture(0)

width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))

fourcc = cv2.VideoWriter_fourcc(*"MP4V")
writer = cv2.VideoWriter("captures/record.mp4", fourcc, 20, (width, height))

while True:
    is_camera_working, display = cam.read()
    cv2.imshow("Camera Data", display)

    if cv2.waitKey(25) & 0xFF == ord("q"):
        break

cam.release()
writer.release()

cv2.destroyAllWindows
问题分析与解决方法

核心问题:未写入视频帧

你的代码仅初始化了VideoWriter,但循环中没有把读取到的帧写入文件,这是录制出空文件/无法播放的根本原因,和FFmpeg的警告无关。

解决步骤:

  1. 添加帧写入逻辑
    在循环里调用writer.write(display),把每一帧写入视频文件,建议放在cv2.imshow之后、退出判断之前。

  2. 处理FFmpeg警告(可选)
    警告源于MP4容器对大写MP4V编码器标签兼容性差,换用以下任意方式即可解决:

    • 使用小写的mp4v:fourcc = cv2.VideoWriter_fourcc(*"mp4v")
    • 使用兼容性更好的H.264编码器:fourcc = cv2.VideoWriter_fourcc(*"avc1")
    • 让OpenCV自动选择合适编码器:将fourcc参数设为-1,运行时会弹出选择框供你挑选兼容的编码器
  3. 完善代码健壮性

    • 检查摄像头是否成功打开,避免后续报错
    • 校验cam.read()的返回值,防止读取空帧导致崩溃
    • 修复cv2.destroyAllWindows的语法错误,需要添加括号:cv2.destroyAllWindows()

修改后的完整代码

import cv2

# 初始化摄像头并检查是否成功打开
cam = cv2.VideoCapture(0)
if not cam.isOpened():
    print("无法打开摄像头")
    exit()

width = int(cam.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cam.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 使用兼容的H.264编码器
fourcc = cv2.VideoWriter_fourcc(*"avc1")
# 或者用自动选择:fourcc = -1
writer = cv2.VideoWriter("captures/record.mp4", fourcc, 20, (width, height))

while True:
    is_camera_working, display = cam.read()
    # 检查是否成功读取帧
    if not is_camera_working:
        print("无法获取摄像头帧")
        break
    
    cv2.imshow("Camera Data", display)
    # 写入帧到视频文件
    writer.write(display)

    if cv2.waitKey(25) & 0xFF == ord("q"):
        break

# 释放资源
cam.release()
writer.release()
cv2.destroyAllWindows()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:43:27