Почему моя программа смены разрешения файлов python cv2 .mp4 создает поврежденные файлы? - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь преобразовать файл mp4 с разрешением 1920x1080p в файлы с разрешением 1280x720 и 720x480, и сценарий создает файлы, но содержимое файлов неверное. Размер файла 1280x720 огромен (98 МБ, тогда как исходный файл - всего 15 МБ), он ровно в два раза больше исходного файла, и он зацикливает первый файл. Второй файл очень маленький (185 КБ и не может быть открыт с помощью Quick Time Player. Я пробовал много вещей, например, перемещал инструкции и различные повторяющиеся циклы, но ни один из них не работал. Скрипт не показывает никаких сообщения об ошибках, поэтому я действительно не знаю, что является причиной этой неисправности. Заранее благодарим за любую помощь! Вот мой код:

import cv2 
import numpy as np
from tkinter import Tk
from tkinter.filedialog import askopenfilename

Tk().withdraw()
movFile = askopenfilename()

movCap = cv2.VideoCapture(movFile)

movWidth = movCap.get(cv2.CAP_PROP_FRAME_WIDTH )
movHeight = movCap.get(cv2.CAP_PROP_FRAME_HEIGHT )
movFPS =  movCap.get(cv2.CAP_PROP_FPS)

print ('The width of the video is:', movWidth)
print ('The height of the video is:', movHeight)
print ('The FPS of the video is:', movFPS)

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

os.chdir ('/Users/garrettanderson/Documents/internship-project/Python_Scripts')

if movWidth <= 1920 and movHeight <= 1080:
    repeatNum = 1
    resizeWidth = 1280
    resizeHeight = 720
    movName = 'movResize1280x720.mov'
    for repeatNum in range (2):
        print(resizeWidth, resizeHeight, repeatNum)

        movOut = cv2.VideoWriter(movName, fourcc, 30, (resizeWidth,resizeHeight))

        while True:
            ret, frame = movCap.read()

            if ret == True:
                b = cv2.resize(frame,(resizeWidth,resizeHeight),fx=0,fy=0, interpolation = cv2.INTER_CUBIC)
                movOut.write(b)
            else:
                break

        resizeWidth = 720
        resizeHeight = 480
        movName = 'movResize720x480.mov'
        print (movCap)
        print (movOut)

    movCap.release()
    movOut.release()
    cv2.destroyAllWindows()
print ('File resized and converted')```
...