python opencv videowriter不会#39;写视频

时间:2015-03-28 18:31:12

标签: python opencv video

我刚开始使用opencv编写python。 我使用了opencv 3.0.0教程的以下页面

Tutorial at read the docs

当我尝试使用保存视频的示例时,它不起作用。 它显示来自网络摄像头的内容,并且还创建一个名为output.avi的文件,但是当我检查ouput.avi的大小时,它是零字节。 我也尝试使用不同的编解码器,如YUY2

我使用python 2.7.8和opencv 3.0.0 和Windows 8.1

14 个答案:

答案 0 :(得分:10)

更换:

fourcc = cv2.VideoWriter_fourcc(*'XVID')

使用:

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

为我工作......

更一般地说:

查看Twilio's Request Parameter之后的视频压缩格式的四分之一代码,无论代码是什么 - 例如' FMP4'对于FFMpeg - 按以下方式插入:

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:4)

确保使用正确的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上进行尝试。

答案 3 :(得分:4)

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

它是(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()

答案 4 :(得分:2)

在我的情况下,我认为编解码器是一个障碍,但事实并非如此。相反,调整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,反之亦然。不必担心协调编解码器。

答案 5 :(得分:1)

这应该是您正在使用的编解码器的问题。

你试过了吗?

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

这个对我有用。

答案 6 :(得分:1)

我怀疑视频写入无声失败的原因很多,在我的情况下,我的帧是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()

答案 7 :(得分:0)

在Windows 7上,使用Python 2.7和OpenCV 2.4.8,我发现如果文件NAME为"output.mpg"则不会写入。

我通过更改为"output.avi"解决了这个问题。

答案 8 :(得分:0)

我将视频编写器的大小更改为屏幕分辨率的大小,并且可以正常工作。

这是解决方法。

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

答案 9 :(得分:0)

我有完全一样的问题。我在C ++中使用OpenCV,但我相信您仍然可以通过-1而不是选择编解码器,因此即使在python中,您也可以使用可用编解码器的下拉菜单。从那里开始,我尝试了所有不同的编解码器,就像Leonard Zhou一样,IYUV编解码器是最适合我的编解码器。还要注意,即使我可以在另一台具有相同代码和相同编解码器安装程序的机器上很好地使用XVID,它也是唯一起作用的。

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

在我指定实际帧大小而不是我认为的大小后,它对我有用:

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) 放入 while 循环中的 cv2.imshow("Frame", frame) 之前。

答案 12 :(得分:0)

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

答案 13 :(得分:-2)

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

请记住,在使用 pyinstaller 之前,您必须pip install pyinstaller