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()
关键改动说明
- 修正相机索引:用
v4l2-ctl --list-devices确认C920对应的/dev/videoN,将CAMERA_INDEX设为N(通常是0)。 - 强制设置MJPG捕获格式:相机默认输出YUYV未压缩格式,1920x1080@30的带宽极高,容易丢帧且会导致OpenCV写入时编码头混乱,设置MJPG格式后相机输出压缩帧,稳定性和兼容性更好。
- 验证参数生效:打印实际工作参数,确保相机确实工作在你需要的1920x1080@30模式下。
- 添加
waitKey:原代码没有窗口事件处理,会导致预览窗口无响应,同时部分系统下会影响帧捕获的稳定性。
验证修复效果
录制完成后,用以下命令检查文件编码:
ffmpeg -i output.avi
如果输出中包含Video: mjpeg (MJPG / 0x47504A4D),说明编码正确,此时VLC或Dragon Player应该可以正常播放。
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

