OpenCV videowriter 不写视频

Posted

技术标签:

【中文标题】OpenCV videowriter 不写视频【英文标题】:OpenCV videowrite doesn't write video 【发布时间】:2015-06-01 23:29:45 【问题描述】:

我使用了OpenCV 3.0.0教程中的以下页面:Tutorial in docs

当我尝试使用保存视频的示例时,它不起作用。

它显示来自网络摄像头的内容,并创建一个名为output.avi 的文件,但当我检查ouput.avi 的大小时,它是零字节。

我也尝试使用不同的编解码器,例如YUY2

我使用Python 2.7.8OpenCV 3.0.0Windows 8.1

【问题讨论】:

【参考方案1】:

确保您使用的是正确的fourcc 4 字节代码。教程上的例子有:

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

此“XVID”代码可能仅适用于 linux。示例上方的文档说明(在教程中): “在 Windows 中:DIVX(更多有待测试和添加)。”因此,如果您还没有,请尝试将上面的fourcc 行替换为:

fourcc = cv2.VideoWriter_fourcc(*'DIVX')

我经常在 linux 上使用 cv2.VideoWriter 并且它总是有效的。因此,如果上述方法不起作用,您可以随时在 linux vm 上尝试。

【讨论】:

不幸的是,我无法让它工作。 DIVX 对我不起作用。感谢您的帮助。 CV2 使用 ffmpeg。可能是 cv2 没有找到应用程序。 我查看了我的代码,发现我有这一行:fourcc = cv2.cv.CV_FOURCC('X', 'V', 'I', 'D')。这适用于 Linux 虚拟机,但您可以进行适当的更改并尝试一下。我不知道我最初是在哪里找到这段代码的,但它对我有用。 它在 Linux 上不起作用,Debian Stretch 稳定。如果对你来说是,那么你是一个幸运的人。对我来说,它已经正确创建了一次输出文件,一次长度为 0 字节,并且 500 次没有创建文件(没有报告错误;命令计时好像一切正​​常):((( @mirek 我刚刚在安装了 opencv3 的 ubuntu 16.04 上对其进行了测试,它对我有用。我使用彩色图像帧进行了测试,因此我没有指定 isColor 标志,但是您可能需要根据需要验证您是否将其正确设置为 True/False。如果您设置不正确,这不会出现异常,您只会得到一个“无法播放”的视频。如果这没有帮助,可能是您需要在您的机器上安装 ffmpeg 或替代方案。【参考方案2】:

应该是你使用的编解码器有问题。

你试过了吗:

cv.CV_FOURCC('i', 'Y', 'U', 'V')

这个对我有用。

【讨论】:

【参考方案3】:

替换:

fourcc = cv2.VideoWriter_fourcc(*'XVID')

与:

fourcc = cv2.VideoWriter_fourcc('M','J','P','G')

为我工作...

更笼统地说:

查找here 之后的视频压缩格式的fourcc 代码,无论代码是什么——例如FFMpeg 的“FMP4”——按以下方式插入:

cv2.VideoWriter_fourcc('F','M','P','4')

【讨论】:

其实(*'XVID')('X', 'V', 'I', 'D')是一样的,看看docs.python.org/dev/tutorial/… 是的,cv2.VideoWriter_fourcc('M','J','P','G') 有效。我使用opencv 4。【参考方案4】:

我遇到了同样的问题,我通过将视频输出分辨率指定为与输入完全相同来解决它:

cap = cv2.VideoCapture('vtest.avi')
...
out = cv2.VideoWriter('output.avi',fourcc, 20.0,(int(cap.get(3)),int(cap.get(4))))

当然要确保你安装了 ffmpeg 并且可以正常工作。

【讨论】:

即使输入来自转换后的PIL图像,也要确保大小相同!【参考方案5】:

在 Windows 7 上并使用 Python 2.7 和 OpenCV 2.4.8,我体验到如果文件 NAME 是 "output.mpg" 将不会写入。

我改成"output.avi"解决了。

【讨论】:

【参考方案6】:

就我而言,我认为编解码器是一个障碍,但事实并非如此。相反,调整 videoWriter() 消耗的尺寸起到了作用:

(ok, frame) = cv2.VideoCapture(videoPath).read()

 fourcc = cv2.VideoWriter_fourcc(*'XVID')
 out = cv2.VideoWriter(output, fourcc, 10.0, (1280, 720))

(1280,720) 被使用,因为 frame.shape 来自我的视频输出 (1280, 720, 3)。它使 avi 到 mp4 成为可能,反之亦然。不必担心协调编解码器。

【讨论】:

【参考方案7】:

我将视频编写器的大小更改为我的屏幕分辨率大小,并且效果很好。

这是解决方案。

out = cv2.VideoWriter("output.avi", fourcc, 5.0, (1920, 1080))

【讨论】:

【参考方案8】:

我有完全相同的问题。我在 C++ 中使用 OpenCV,但我相信您仍然可以传递 -1 而不是选择编解码器,因此即使在 python 中您也可以拥有可用编解码器的下拉菜单。从那里我尝试了所有不同的编解码器,就像 Leonard Zhou 一样,IYUV 编解码器对我有用。另请注意,即使我可以在另一台具有相同代码和相同编解码器安装程序的机器上正常使用 XVID,它也是唯一有效的。

编辑: 我建议作为一个补丁工作,主要问题是通过在可执行文件的文件夹中添加opencv_ffmpeg dll 来解决。

【讨论】:

【参考方案9】:

检查图像的分辨率! 我尝试使用形状奇特的图像 (1284x709),最终得到了 1k 大小的不可读视频。将图像大小调整为最接近的“常见”分辨率后: image = cv2.resize(image, (1280,720)), 它工作得很好。

【讨论】:

另外,检查错误消息。我的 jupyter 笔记本上有:OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not supported with codec id 13 and format 'mp4 / MP4 (MPEG-4 Part 14)' OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v ',并按照建议使用确切的 4 个字母 (mp4v),尊重大小写,消息消失了。【参考方案10】:

我在这个问题上苦苦挣扎了几个小时,然后我意识到我输入了错误的图像形状。

(width, height),即:

(image.shape[1], image.shape[0])

而不是

(image.shape[0], image.shape[1])

这就是我的工作代码最终的样子......(我在 Windows 机器上):

video_path = FILENAME + '.avi'
size = images[0].shape[1], images[0].shape[0] ## <<<--- NOTICE THIS
video = cv2.VideoWriter(video_path,cv2.VideoWriter_fourcc(*'DIVX'), 60, size)  

for img in images:  
    video.write(img)

cv2.destroyAllWindows()
video.close()

【讨论】:

非常感谢。对我来说问题是,只有 DIVX asfourcc 有效。【参考方案11】:

我怀疑视频写入失败的原因有很多,就我而言,我的帧是 3 通道图像和 4 通道图像(透明叠加)的合成。将最终结果转换为 BGR 格式如下,可以成功保存视频。

width = 1280
height = 720
FPS = 30
fourcc = VideoWriter_fourcc(*'avc1')
video = VideoWriter('output.mp4', fourcc, float(FPS), (width, height))
for img in images:
  frame = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
  video.write(frame)
video.release()

【讨论】:

【参考方案12】:

在我分配了实际的帧大小而不是我认为的大小之后,它对我有用:

ret, frame = cap.read()
height, width, channels = frame.shape
codec = cv2.VideoWriter_fourcc(*"DIVX")
out=cv2.VideoWriter('new.avi',codec ,20.0,(width, height))

并将out.write(frame) 放在cv2.imshow("Frame", frame) 之前的while 循环中。

【讨论】:

在我的系统上,只有“DIVX”有效,而 opencv 文档示例中的编码“M”、“J”、“P”、“G”只是默默地不写入文件。我希望有一种方法可以验证编解码器,以便我的代码更安全地移植。【参考方案13】:

我尝试使用 pyinstaller Recorder.py 创建它的 exe,它对我有用。

记住在使用pyinstaller之前你必须pip install pyinstaller

【讨论】:

【参考方案14】:

为了说明这一点,请确保您不仅提供了正确的路径,而且还提供了视频名称。 即path/'video.avi' 而不仅仅是path/。否则它将静默失败。

【讨论】:

【参考方案15】:

在我的情况下,我正在调整图像大小,但以原始大小而不是新大小保存视频

【讨论】:

【参考方案16】:

上述方法仅适用于 RGB 帧/图像。如果您尝试写入灰度图像,请将参数“0”传递给 VideoWriter():

fourcc = cv2.VideoWriter_fourcc(*"MJPG")
out = cv2.VideoWriter('output.avi', fourcc, 30, size, 0)

【讨论】:

以上是关于OpenCV videowriter 不写视频的主要内容,如果未能解决你的问题,请参考以下文章

python opencv videowrite不写视频

使用opencv中的VideoWriter函数,保存视频

使用 videowriter opencv 的视频大小为 0 字节

OPENCV,无法打开类 VideoWriter

使用 openCV 从 numpy 数组生成视频

OpenCV VideoWriter 帧率问题