我尝试录制30秒的视频,但输出视频只有15秒并加速。
import numpy as np
import os
import cv2
import time
filename = 'video.avi'
frames_per_second = 30.0
res = '480p'
def change_res(cap, width, height):
cap.set(3, width)
cap.set(4, height)
STD_DIMENSIONS = {
"480p": (640, 480),
"720p": (1280, 720),
"1080p": (1920, 1080),
"4k": (3840, 2160),
}
def get_dims(cap, res='1080p'):
width, height = STD_DIMENSIONS["480p"]
if res in STD_DIMENSIONS:
width,height = STD_DIMENSIONS[res]
change_res(cap, width, height)
return width, height
VIDEO_TYPE = {
'avi': cv2.VideoWriter_fourcc(*'XVID'),
'mp4': cv2.VideoWriter_fourcc(*'XVID'),
}
def get_video_type(filename):
filename, ext = os.path.splitext(filename)
if ext in VIDEO_TYPE:
return VIDEO_TYPE[ext]
return VIDEO_TYPE['avi']
cap = cv2.VideoCapture(0)
fps = cap.get(cv2.CAP_PROP_FPS)
print(fps)
out = cv2.VideoWriter(filename, get_video_type(filename), 30, get_dims(cap, res))
stop_time = time.time() + 30.0
while stop_time >= time.time():
ret, frame = cap.read()
out.write(frame)
cap.release()
out.release()
cv2.destroyAllWindows()
我打印了来自视频捕捉的FPS,它返回30.0。相机是罗技C920。
任何帮助都会很棒。
答案 0 :(得分:0)
您正在使用VideoCapture
从相机中读取并写入VideoWriter
。您希望阅读时间与VideoWriter
的写作时间一致,但显然情况并非如此。
我猜你在30秒内(你为你的循环指定的时间)读取了多个帧,并且因为这些帧数不足以创建30秒的视频,所以创建了一个较小的帧。大概从你的说法来看,你需要30*30 = 900
帧,你只有一半让我们说450帧。因此,当您将它们传递给作者时,它们对应于15秒的视频。另一方面,由于你提供了30秒的录音时间,它们对应于30秒的实际动作,这就是为什么你看到加速版只有15秒的原因。
我的猜测是你可以尝试一些东西来加速你的视频捕捉或你的视频写作,因为你顺序地应用它们(一个接一个地)。你的相机支持30fps @ 1080p,所以我猜你可以实现你的目标。
我的第一个想法是只记录你的图像30秒,然后将它们写在你的视频中。这样,您首先只关注捕获图像。您可以通过使用类似列表或字典的容器来保存图像来实现此目的。然后,在完成录制后将其写下来。您可以在30秒内查看可以捕获的数字,以查看录制的实际fps。如果你得到一个值为850帧的值,你可以创建一个30秒的850/30 = 28.33
fps视频,这在实践中没有太大的区别,而不是30fps代表一个没有加速的视频。当然,在这种情况下你应该创建一个合适的VideoWriter
(在构造函数中传递一个合适的第三个参数)。