OpenCV保存灰度AVI视频报错‘could not demultiplex stream’求解
解决OpenCV保存灰度AVI视频时的"could not demultiplex stream"错误
嘿,我来帮你搞定这个报错问题!你遇到的"could not demultiplex stream",大概率是因为灰度视频的帧格式和VideoWriter的设置不匹配,再加上可能用了旧版OpenCV的API写法,导致编解码器不兼容。咱们一步步来解决:
核心问题拆解
你当前的代码里读取的是彩色帧(frame.shape返回的三个值里,第三个是3通道),但要保存灰度视频,得把帧转成单通道,同时VideoWriter的初始化必须明确告诉它这是灰度视频。另外,你用的cv2.cv.CV_FOURCC是OpenCV 2.x的旧写法,3.x及以后的版本得用cv2.VideoWriter_fourcc,这也可能是编解码器出问题的原因。
修正后的完整代码
import imutils import cv2 import numpy as np interval = 30 outfilename = 'output.avi' threshold = 100. fps = 10 # 读取输入视频 cap = cv2.VideoCapture("video.mp4") ret, frame = cap.read() if not ret: print("哎呀,读取视频文件失败了!") exit() # 先把第一帧转成灰度,获取正确的尺寸(灰度帧只有高和宽两个维度) gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) height, width = gray_frame.shape # 用新版本OpenCV的FOURCC写法,优先选XVID(兼容性拉满) fourcc = cv2.VideoWriter_fourcc(*'XVID') # 关键!最后一个参数isColor=False,告诉OpenCV要写灰度视频 out = cv2.VideoWriter(outfilename, fourcc, fps, (width, height), isColor=False) # 循环处理每一帧 while cap.isOpened(): ret, frame = cap.read() if not ret: break # 视频读完了就退出循环 # 把彩色帧转成灰度 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 这里可以加你原本的处理逻辑,比如阈值判断之类的 # if ... 你的处理代码 ... # 写入灰度帧 out.write(gray) # 别忘了释放资源! cap.release() out.release() cv2.destroyAllWindows()
必看的关键注意点
- 灰度格式匹配:一定要设置
isColor=False,而且写入的必须是单通道的灰度帧,不然VideoWriter会因为格式不兼容报错。 - 编解码器选对:XVID是最稳妥的选择,跨Windows、Linux都能用;如果还是不行,试试MJPG编解码器(
cv2.VideoWriter_fourcc(*'MJPG')),它对灰度视频的支持也很稳定。 - API版本适配:别再用旧版的
cv2.cv.CV_FOURCC了,换成cv2.VideoWriter_fourcc适配3.x及以上的OpenCV版本。 - 帧尺寸一致:写入的每帧尺寸必须和初始化VideoWriter时的
(width, height)完全一样,不能有缩放或者裁剪导致的尺寸不匹配。
额外排查小技巧
如果按上面的改了还是报错,可以试试这些:
- 先确认输入视频能正常读取,用
cv2.imshow("Gray Frame", gray)看看灰度帧是不是正常生成的。 - 换个输出格式试试,比如保存成
.mp4(编解码器用mp4v:cv2.VideoWriter_fourcc(*'mp4v')),有时候AVI容器和编解码器的组合容易出幺蛾子。 - 检查系统有没有安装对应的编解码器,比如Windows上可以装个K-Lite Codec Pack补充编解码器支持。
内容的提问来源于stack exchange,提问作者Nithin
相关产品推荐
相关产品推荐

