我在Python环境中使用OpenCV来捕获来自外部源的视频流,显示视频,并将视频写入文件。视频流可以来自不同的视频源。我需要使用与传入视频完全相同的帧速率来编写视频(例如,60 fps,29.97 fps,30 fps等)。
由于流视频没有嵌入流中的帧速率,我需要确定正确的帧速率。我尝试过其他人对一些帧进行采样的建议,然后将捕获的帧数除以经过的时间。对我来说,这会导致帧速率接近但不够接近。
当我使用VLC Media Player捕获视频时,VLC会正确确定帧速率。
这是我目前正在使用的Python脚本。它缓冲500帧以计算帧速率,然后开始写入视频,同时继续捕获(具有500帧延迟)。 (VLS捕获/写入没有明显的延迟。)
对我来说最重要的是 - 正确地确定传入视频流的帧速率。第二个重要性 - 我希望在捕获后以最小延迟编写视频。
有什么建议吗?
import numpy as np
import cv2
from time import time
cap = cv2.VideoCapture(0)
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
kount = 0
delay = 500
buffer = []
start = time()
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
kount += 1
buffer.append(frame)
cv2.imshow('frame',frame)
if kount >= delay:
if kount == delay:
end = time()
fps = kount / (end - start)
out = cv2.VideoWriter('output.avi',fourcc, fps, (frame_width,frame_height))
out.write(buffer[kount-delay])
if cv2.waitKey(1) & 0xFF == ord('q'):
for i in range(kount - delay, kount):
out.write(buffer[i])
break
else:
break
print("Frames Per Second = ", fps)
cap.release()
out.release()
cv2.destroyAllWindows()