Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和OpenCV-确定捕获的流式视频的正确帧速率_Python_Opencv_Video_Video Capture_Capture - Fatal编程技术网

Python和OpenCV-确定捕获的流式视频的正确帧速率

Python和OpenCV-确定捕获的流式视频的正确帧速率,python,opencv,video,video-capture,capture,Python,Opencv,Video,Video Capture,Capture,我在Python环境中使用OpenCV从外部源捕获视频流,显示视频,并将视频写入文件。视频流可以来自不同的视频源。我需要使用与传入视频完全相同的帧速率来编写视频(例如,60 fps、29.97 fps、30 fps等) 因为流视频没有嵌入到流中的帧速率,所以我需要确定正确的帧速率。我尝试过其他人的建议,对一些帧进行采样,然后将捕获的帧数除以经过的时间。对我来说,这会导致帧速率接近,但不够接近 当我用VLC Media Player拍摄视频时,VLC会正确确定帧速率 下面是我目前正在使用的Pyth

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