特定の開始フレームと終了フレームインデックスに基づいてビデオをチャンクに分割するためのツール(または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()