如何在录制过程中创建常规视频块?

How to create regular video chunks during recording?

我想在捕获相机时创建常规的多个视频块。视频块应为 3 秒,容器为 .mp4。捕获正常,但未创建块。

import numpy as np
import cv2
import time
import os 

cap = cv2.VideoCapture(0)

try:
    if not os.path.exists('chunks'):
        os.makedirs('chunks')
except OSError:
    print ('Error: Creating directory of data')
    
next_time = time.time() + 3

while True:
    # Capture frame-by-frame
    ret, frame = cap.read() 
    
    if time.time() > next_time:
        fourcc = cv2.VideoWriter_fourcc(*'XVID')
        chunks = cv2.VideoWriter('/chunks/' + str(time.strftime('%d %m %Y - %H %M %S' )) + '.mp4', fourcc, 15, (640,480))
        next_time += 3

cap.release()
cv2.destroyAllWindows()

您的代码中存在一些错误:

  1. 您在循环中的任何地方都没有在 chunks 对象上调用 cv2.VideoWriter.write 方法。在您的代码中,它看起来像这样:chunks.write(frame).

  2. 对于每个要生成的视频,您都需要调用 cv2.VideoWriter.release 方法,例如 chunks.release().

  3. 生成的视频的持续时间不取决于生成一个视频所花费的时间;它依赖于写入视频的帧数和视频的帧率。在您的代码中,您选择了帧速率 15,因此每个视频需要 15 * 3 = 45 帧才能达到 3 秒长。

更正后的代码可能如下所示:

import os
import time
import cv2

try:
    if not os.path.exists('chunks'):
        os.makedirs('chunks')
except OSError:
    print('Error: Creating directory of data')

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*"XVID")
chunks = cv2.VideoWriter(f"chunks/{time.strftime('%d %m %Y - %H %M %S')}.mp4", fourcc, 15, (640, 480))
i = 0
while True:
    i += 1
    if i > 45:
        chunks.release()
        chunks = cv2.VideoWriter(f"chunks/{time.strftime('%d %m %Y - %H %M %S')}.mp4", fourcc, 15, (640, 480))
        i = 0
    ret, frame = cap.read()
    chunks.write(frame)

cap.release()
cv2.destroyAllWindows()

效果很好。