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\nimport 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