python - OpenCV Python VideoWriter 保存损坏的视频

标签 python opencv save video-processing

在我开始修改视频中的帧之前,我试图获得一个复制视频的非常简单的示例。但是,与 2.8 mb barriers.avi 视频相比,output.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::您想创建一个 .avi 视频文件。因此,您需要将 fourcc 初始化为 MJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

创建视频文件有一定的组合。例如,如果您想创建一个 .mp4,您可以将 fourcc 初始化为 *'mp4v'


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

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

代码:


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

关于python - OpenCV Python VideoWriter 保存损坏的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63908973/

相关文章:

python - 为什么 Ruby 的 Float#round 行为与 Python 不同?

python - 从 Python 数据结构中解压位置参数

python - Numpy 数组到图形

c++ - 使用opencv SVM训练火灾检测

c# - TableAdapter.Update(数据集)未保存到 Ado.NET 中的数据库

ios - 将 arkit 快照直接保存到照片库 swift 4

android - 如何使用 buildChildDocumentsUriUsingTree 过滤查询结果

python - 删除最后打印的字符python

c++ - 如何检测rgb图像格式真的是灰色的?

QT Creator 在运行程序时以代码 0 退出