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

sla*_*hip 5 python video opencv video-capture capture

I\xe2\x80\x99m 在 Python 环境中使用 OpenCV 从外部源捕获视频流、显示视频并将视频写入文件。视频流可以来自不同的视频源。我需要使用与传入视频完全相同的帧速率(例如,60 fps、29.97 fps、30 fps 等)编写视频。

\n\n

由于流视频没有嵌入流中的帧速率,因此我需要确定正确的帧速率。我尝试过其他人的建议,对一些帧进行采样,然后将捕获的帧数除以经过的时间。对我来说,这会导致帧速率接近,但还不够接近。

\n\n

当我使用 VLC 媒体播放器捕获视频时,VLC 正确确定帧速率。

\n\n

这是 I\xe2\x80\x99m 当前使用的 Python 脚本。它缓冲 500 帧来计算帧速率,然后开始写入视频,同时继续捕获(有 500 帧延迟)。(VLS 捕获/写入\xe2\x80\x99t 没有明显的延迟。)

\n\n

对我来说最重要的是 \xe2\x80\x93 正确确定传入视频流的帧速率。第二个重要性 \xe2\x80\x93 我想在捕获后以最小的延迟编写视频。

\n\n

有什么建议么?

\n\n
import numpy as np\nimport cv2\nfrom time import time\n\ncap = cv2.VideoCapture(0)\nframe_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))\nfourcc = cv2.VideoWriter_fourcc(*\'DIVX\')\nkount = 0\ndelay = 500\nbuffer = []\nstart = time()\nwhile(cap.isOpened()):  \n    ret, frame = cap.read()\n    if ret==True:\n        kount += 1\n        buffer.append(frame)\n        cv2.imshow(\'frame\',frame)\n        if kount >= delay:\n            if kount == delay:\n                end = time()\n                fps = kount / (end - start)\n                out = cv2.VideoWriter(\'output.avi\',fourcc, fps, (frame_width,frame_height))\n            out.write(buffer[kount-delay])\n        if cv2.waitKey(1) & 0xFF == ord(\'q\'):\n            for i in range(kount - delay, kount):\n                out.write(buffer[i])\n            break\n    else:\n        break\nprint("Frames Per Second = ", fps)\ncap.release()\nout.release()\ncv2.destroyAllWindows()\n
Run Code Online (Sandbox Code Playgroud)\n