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

Python使用MJPG编码保存AVI视频无法播放问题求助

问题分析与解决方案

从你提供的文件头片段可以看到,AVI文件的流信息里标记的编码是XVID,但你明明指定了MJPG编码——这是核心问题。原因是你的代码只给VideoWriter设置了MJPG,却没有配置VideoCapture从相机获取MJPG格式的帧,默认情况下相机输出的是未压缩的YUYV格式,OpenCV在转换写入时出现了编码头不匹配的问题,导致播放器无法识别。

另外需要注意:你用v4l2-ctl检查的是/dev/video0,但代码里打开的是索引4的相机,大概率是相机索引对应错误,导致你操作的不是Logitech C920。


修正后的代码

import cv2
import time

# 相机索引:对应/dev/videoN的N,用v4l2-ctl --list-devices确认C920的设备路径
CAMERA_INDEX = 0
TARGET_WIDTH = 1920
TARGET_HEIGHT = 1080
TARGET_FPS = 30.0

# 打开相机
cap = cv2.VideoCapture(CAMERA_INDEX)
if not cap.isOpened():
    print("Error: 无法打开相机")
    exit()

# 强制设置相机输出MJPG格式(必须先设置编码,再设置分辨率和帧率)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, TARGET_WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, TARGET_HEIGHT)
cap.set(cv2.CAP_PROP_FPS, TARGET_FPS)

# 验证实际生效的参数,确保相机正确响应设置
actual_fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))
print(f"实际工作参数:{cap.get(cv2.CAP_PROP_FRAME_WIDTH)}x{cap.get(cv2.CAP_PROP_FRAME_HEIGHT)} @ {cap.get(cv2.CAP_PROP_FPS)}fps")
print(f"捕获编码:{chr(actual_fourcc & 0xFF)}{chr((actual_fourcc >> 8) & 0xFF)}{chr((actual_fourcc >> 16) & 0xFF)}{chr((actual_fourcc >> 24) & 0xFF)}")

# 创建MJPG编码的AVI写入器
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi', fourcc, TARGET_FPS, (TARGET_WIDTH, TARGET_HEIGHT))
if not out.isOpened():
    print("Error: 无法初始化视频写入器")
    cap.release()
    exit()

# 录制10秒
start_time = time.time()
while (time.time() - start_time) < 10:
    ret, frame = cap.read()
    if not ret:
        print("Error: 无法读取帧")
        break
    
    out.write(frame)
    cv2.imshow('录制预览', frame)
    
    # 按Q键提前结束录制
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
out.release()
cap.release()
cv2.destroyAllWindows()

关键改动说明

  1. 修正相机索引:用v4l2-ctl --list-devices确认C920对应的/dev/videoN,将CAMERA_INDEX设为N(通常是0)。
  2. 强制设置MJPG捕获格式:相机默认输出YUYV未压缩格式,1920x1080@30的带宽极高,容易丢帧且会导致OpenCV写入时编码头混乱,设置MJPG格式后相机输出压缩帧,稳定性和兼容性更好。
  3. 验证参数生效:打印实际工作参数,确保相机确实工作在你需要的1920x1080@30模式下。
  4. 添加waitKey:原代码没有窗口事件处理,会导致预览窗口无响应,同时部分系统下会影响帧捕获的稳定性。

验证修复效果

录制完成后,用以下命令检查文件编码:

ffmpeg -i output.avi

如果输出中包含Video: mjpeg (MJPG / 0x47504A4D),说明编码正确,此时VLC或Dragon Player应该可以正常播放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:30:57