Python cv2 не пишет видео - PullRequest
       9

Python cv2 не пишет видео

0 голосов
/ 26 марта 2020

Привет, я пытаюсь разбить длинное видео на небольшие видео. Я получил некоторый код inte rnet, но когда я его запускаю, он не пишет видео, что не так с моим кодом? Я не получаю никаких ошибок.

import cv2
count = 0
if __name__ == '__main__':
    vidPath = 'VideoNietBewerkt.mp4'
    shotsPath = '/videos/%d.avi' % count
    segRange = [(0,1000),(1000,2000),(2000,3000)] # a list of starting/ending frame indices pairs

    cap = cv2.VideoCapture(vidPath)
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    fourcc = int(cv2.VideoWriter_fourcc('X','V','I','D')) # XVID codecs

    for idx,(begFidx,endFidx) in enumerate(segRange):
        writer = cv2.VideoWriter(shotsPath,fourcc,fps,size)
        cap.set(cv2.CAP_PROP_POS_FRAMES,begFidx)
        ret = True # has frame returned
        while(cap.isOpened() and ret and writer.isOpened()):
            ret, frame = cap.read()
            frame_number = cap.get(cv2.CAP_PROP_POS_FRAMES) - 1
            if frame_number < endFidx:
                writer.write(frame)
            else:
                break
        writer.release()
    count += 1

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Проблема заключалась в том, что я не закрывал свою переменную cap, я исправил это, поместив все в для l oop

import cv2
vidPath = 'VideoNietBewerkt.mp4'
segRange = [(0,5000),(5000,50000),(50000,100400)] # <-- to fit my sample movie

for idx,(begFidx,endFidx) in enumerate(segRange):
    cap = cv2.VideoCapture(vidPath) # <---- Open Cap
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    size = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    fourcc = int(cv2.VideoWriter_fourcc(*'jpeg'))
    shotsPath = f'movie_{str(idx)}.avi' # <-- use idx for naming the output file
    print(f'saving file: {shotsPath}')

    writer = cv2.VideoWriter() # <-- instantiate the writer this way
    writer.open(shotsPath, fourcc, fps, size) # <-- open the writer
    cap.set(cv2.CAP_PROP_POS_FRAMES, begFidx)

    while(cap.isOpened() and writer.isOpened()): # removed and ret
        ret, frame = cap.read()
        frame_number = cap.get(cv2.CAP_PROP_POS_FRAMES) - 1
        if frame_number < endFidx:
            writer.write(frame)
        else:
            break

    writer.release()
    cap.release() #<--- Closed Cap
0 голосов
/ 26 марта 2020

Кажется, что есть проблема с кодом c (по крайней мере для меня) и с выходным именем файла, которое не обновляется за пределами l oop.

Я внес некоторые изменения для работая на моей машине, попробуйте это коротким мовом ie, в самом коде мало комментариев.

Это сработало для меня:

import cv2
vidPath = 'movie.mp4'
segRange = [(0,30),(30,60),(60,90)] # <-- to fit my sample movie

cap = cv2.VideoCapture(vidPath)
fps = int(cap.get(cv2.CAP_PROP_FPS))
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = int(cv2.VideoWriter_fourcc(*'jpeg')) # <-- I had to change the codec

for idx,(begFidx,endFidx) in enumerate(segRange):
    shotsPath = f'movie_{str(idx)}.avi' # <-- update filename here, use idx for naming the output file
    print(f'saving file: {shotsPath}')

    writer = cv2.VideoWriter() # <-- instantiate the writer this way
    writer.open(shotsPath, fourcc, fps, size) # <-- open the writer
    cap.set(cv2.CAP_PROP_POS_FRAMES, begFidx)

    while(cap.isOpened() and writer.isOpened()): # removed and ret
        ret, frame = cap.read()
        frame_number = cap.get(cv2.CAP_PROP_POS_FRAMES) - 1
        if frame_number < endFidx:
            writer.write(frame)
        else:
            break
    writer.release()
cap.release()
...