여러 시작 및 끝 프레임 인덱스를 기반으로 비디오를 청크로 분할합니다.

여러 시작 및 끝 프레임 인덱스를 기반으로 비디오를 청크로 분할합니다.

특정 시작 및 끝 프레임 인덱스를 기반으로 비디오를 청크로 분할할 수 있는 도구(예: FFmpeg또는 ) 가 있습니까 ? OpenCV예를 들어, 주어진 (0,20),(21,33),(40,60)...각 튜플은 블록의 시작 및 끝 프레임 인덱스 쌍을 나타내며 인접한 블록은 인접하지 않을 수 있습니다.

블록 수가 많을 수 있다는 점에 유의하세요. 예를 들어 1시간짜리 비디오의 경우 1,500개의 분할이 있을 수 있습니다.

답변1

~에 따르면"OpenCV를 사용하여 비디오 만들기", Python(2.7) 및 OpenCV(3.0.0-beta)를 사용하여 분할합니다. (이 방법에서는 오디오가 손실됩니다.)

import cv2

if __name__ == '__main__':
    vidPath = '/path/foo/video.mp4'
    shotsPath = '/path/foo/video/%d.avi' # output path (must be avi, otherwize choose other codecs)
    segRange = [(0,40),(50,100),(200,400)] # 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%idx,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()

관련 정보