Python和OpenCV - 确定捕获的流媒体视频的正确帧率

时间:2017-10-14 19:45:19

标签: python opencv video video-capture capture

我在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()

0 个答案:

没有答案