OpenCV Python VideoWriter保存的视频文件损坏

3

在开始修改视频帧之前,我想先演示一个非常简单的复制视频的例子。然而,输出的output.avi文件与原始的2.8 MB barriers.avi文件相比是一个5KB的损坏文件。我使用的是OpenCV 4.2.0版本和Python 3.7.7版本。

以下是代码:

import cv2

input = cv2.VideoCapture("../video/barriers.avi")
height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('../video/output5.avi', fourcc, 30, (height, width), isColor=True)

while input.isOpened():
    # get validity boolean and current frame
    ret, frame = input.read()

    # if valid tag is false, loop back to start
    if not ret:
        break
    else:
        out.write(frame)

input.release()
out.release()

如果我打印出框架形状,会得到以下结果:
(480, 640, 3)

注意:其他堆栈溢出的解决方案均未能帮助。
编辑:如果使用cv2.imshow(),则所有帧都可以正常显示。
1个回答

6
我希望在你的代码中解决两个问题:

问题1::您想创建一个.avi视频文件。因此,您需要将fourcc初始化为MJPG

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

创建视频文件时有特定的组合方式。例如,如果您想创建一个.mp4文件,您需要将fourcc初始化为*'mp4v'


问题#2:请确保输出视频的大小与输入帧的大小相同。例如:您声明了Videowriter对象的大小为(height, width),那么您的帧大小必须相同:

frame = cv2.resize(frame, (height, width))

Code:


import cv2

cap = cv2.VideoCapture("output.mp4")
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output5.avi', fourcc, 30, (width, height), isColor=True)

while cap.isOpened():
    # get validity boolean and current frame
    ret, frame = cap.read()

    # if valid tag is false, loop back to start
    if not ret:
        break
    else:
        frame = cv2.resize(frame, (width, height))
        out.write(frame)

cap.release()
out.release()

谢谢。这对我来说保存正确了。唯一的问题是 barriers.avi 的视频尺寸为 (宽度 = 640,高度 = 480),而 output.avi 保存的文件尺寸为 (宽度 = 480,高度 = 640)。当调整帧大小时,是否假设某些帧的大小不完全相同?或者是为了缩小输出而进行重新缩放? - Riley K
2
对不起,我犯了一个错误,应该是 frame = cv2.resize(frame, (width, height)) - Ahmet
实际上,通过那个更改,视频又损坏了。也许视频编写者的尺寸被翻转了?编辑:那个修复起作用了。视频编写者的尺寸应该是(宽度,高度),而不是(高度,宽度)。谢谢! - Riley K
3
好的,我觉得我找到了问题所在。问题出在你声明图像尺寸大小时,请使用(宽度, 高度)。但是当你获取图像尺寸大小时,例如:image.shape[:2]返回的是高度和宽度。我已经更新了代码,请告诉我是否有任何问题。 - Ahmet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接