我会这样做:
import cv2
file = "video.avi"
parts = [(15, 30), (50, 79)]
cap = cv2.VideoCapture(file)
ret, frame = cap.read()
h, w, _ = frame.shape
fourcc = cv2.VideoWriter_fourcc(*"XVID")
writers = [cv2.VideoWriter(f"part{start}-{end}.avi", fourcc, 20.0, (w, h)) for start, end in parts]
f = 0
while ret:
f += 1
for i, part in enumerate(parts):
start, end = part
if start <= f <= end:
writers[i].write(frame)
ret, frame = cap.read()
for writer in writers:
writer.release()
cap.release()
解释:
- 导入
cv2模块,定义视频文件的名称以及要保存到不同视频文件中的文件部分:
import cv2
file = "video.avi"
parts = [(15, 30), (50, 79)]
- 定义一个视频捕获设备,从视频文件中读取帧并从中读取一次,以获得视频帧的形状:
cap = cv2.VideoCapture(file)
ret, frame = cap.read()
h, w, _ = frame.shape
- 定义一个fourcc(四字符代码),并定义一个视频作者列表;为您要生成的每个视频制作一个:
fourcc = cv2.VideoWriter_fourcc(*"XVID")
writers = [cv2.VideoWriter(f"part{start}-{end}.avi", fourcc, 20.0, (w, h)) for start, end in parts]
- 定义一个
while 循环,但在此之前,定义一个变量来跟踪while 循环在捕获设备中的哪个帧:
f = 0
while ret:
f += 1
- 在
while 循环内使用for 循环,循环通过部件的开始和结束帧,使用enumerate 方法允许程序在需要时访问每次迭代所在的部件的索引.如果在while 循环之前定义的变量在(包括) 部分的开始和结束之间,则将该帧写入相应的视频写入器(使用@987654332 提供的索引@方法):
for i, (start, end) in enumerate(parts):
if start <= f <= end:
writers[i].write(frame)
ret, frame = cap.read()
- 最后,释放所有视频编写器和捕获设备:
for writer in writers:
writer.release()
cap.release()