视频播放比预期快很多

Video playback is a lot faster than expected

我知道 VideoWriter object's FPS should match the FPS of my webcam. My webcam is a Logitech HD Pro Webcam C920 并且如您所见,规范说它的 FPS 为 30。我仍然没有对值进行硬编码,而是使用 cap.get(CV_CAP_PROP_FPS)(returns 30.0) 以确保匹配 FPS。

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi', fourcc, cap.get(CV_CAP_PROP_FPS), (640, 480))

print(cap.get(CV_CAP_PROP_FPS)) # 30.0

这是我捕捉视频每一帧的方式:

while(cap.isOpened()):
        # Capture frame-by-frame
        ret, frame = cap.read()
        if ret == True:
                out.write(frame)

我的问题是,即使 FPS 匹配,输出视频 (output.avi) 的播放速度约为 x3(根据我的非科学估计),这显然不是我想要的。我尝试过不同的编解码器,但出现了同样的问题。

SO 上有几个问题解决了同样的问题:

OpenCV, captured video runs faster than original camera video!
OpenCV Video capture and fps problem
OpenCV: Video Recording is too fast
http://answers.opencv.org/question/16522/video-recording-is-too-fast/

其中大部分建议将作者的 FPS 与网络摄像头的 FPS 相匹配,我做到了。如果我将 FPS 硬编码为 10,视频播放似乎很正常,但我不想这样做,因为它必须与许多相机一起工作。

我现在真的不知道该怎么做,但我会继续搜索,直到找到解决方案。任何见解表示赞赏!!

检查真实相机FPS 不写视频 - 例如,统计10秒内捕获的帧数
如果 FPS 接近 30,请检查视频录制是否相同。如果 FPS 变得更糟,那么您会错过一些帧,因为您的系统可能无法使用给定的编解码器 (MJPG) 处理此视频流 - 弱处理器等等...

加法: 我认为,您会搜索哪种编解码器对 Raspberry 最有效,并检查 opencv 在您的平台上是否使用了其他库,如 ffmpeg。

@MBo 正确回答了视频播放速度比预期快的原因,但我想为遇到同样问题的人提供更多信息。

首先,这与 Raspberry Pi 有很大关系,所以使用性能更高的机器的人可能不会遇到这个问题。

即使只是从摄像头读取视频流而不写入视频文件,在 640 x 480 分辨率下也可以达到最高 18-20 FPS。在 1920 x 1080 分辨率下,最大 FPS 为 1-2。原因是网络摄像头帧是按顺序读取的,因此只有 CPU 的一个核心用于处理。

在不同线程中读取帧时,在 640 x 480 分辨率下可以达到 24 FPS。不过,如果您有兴趣,请参阅 了解有关并行读取网络摄像头帧的更多信息。

我发现 Raspberry Pi 视频应用程序的唯一真正解决方案是使用 官方相机模块 ,它直接连接到 GPU 并提供 1080p每秒 30 帧。请参阅这个问题,了解为什么 Raspberry Pi 摄像头模块 是 USB 网络摄像头的更好替代品。