OpenCV Python VideoWriter сохраняет поврежденное видео

Sep 16 2020

Я пытаюсь получить очень простой пример копирования видео, прежде чем я начну изменять кадры в видео. Однако видео output.avi представляет собой поврежденный файл размером 5 КБ по сравнению с 2,8 МБ видео barriers.avi. Я использую 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 ().

Ответы

3 Ahx Sep 16 2020 at 03:08

Я хотел бы решить две проблемы в вашем коде:


Проблема №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()