【问题标题】:Video playback is a lot faster than expected视频播放速度比预期快很多
【发布时间】:2015-12-18 19:48:54
【问题描述】:

我知道VideoWriter 对象的 FPS 应该与我的网络摄像头的 FPS 匹配。我的网络摄像头是Logitech HD Pro Webcam C920,如您所见,规范说它的 FPS 为 30。我仍然没有硬编码该值,而是使用cap.get(CV_CAP_PROP_FPS)(返回 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,则视频播放看起来很正常,但我不想这样做,因为它必须与许多相机通用。

我现在真的不知道该怎么做,但我会继续寻找,直到找到解决方案。任何见解都值得赞赏!

【问题讨论】:

    标签: python opencv raspberry-pi video-capture opencv3.0


    【解决方案1】:

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

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

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

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

    我为视频应用程序找到的唯一真正的解决方案是使用Raspberry Pi 是使用official camera module,它直接连接到 GPU 并提供 1080p 和 30 FPS。请参阅 this question,了解为什么 Raspberry Pi camera module 是 USB 网络摄像头更好的替代品。

    【讨论】:

      【解决方案2】:

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

      补充: 我认为,您应该搜索对 Raspberry 最有效的编解码器,并检查您的平台上的 opencv 是否使用了其他库(如 ffmpeg)。

      【讨论】:

      • 我用的是树莓派,可能是处理器太弱了。您如何计算 10 秒内捕获的帧数?为 while 循环的每次迭代增加一个变量,并使用诸如 time.clock() 和/或 time.time() 之类的方法来监控已经过去的秒数?无论如何,谢谢你的帮助,我今天一定会尽快尝试。
      • 按照您的建议手动测试时,相机 FPS 大约为 14没有视频写入,所以我猜处理器很弱。编写视频时大约为 8。但是,我想知道如何使用这种技术编写具有准确播放的视频文件。这意味着如果计算机上正在运行其他东西或在写入视频文件的同时发生随机计算任务,结果将不会很好。显然,必须有另一种方式来做我想做的事,而不受处理器的支配。你怎么看?
      • 我的平台上也使用了 ffmpeg,因为在尝试不同的编解码器/文件格式组合时,我收到这种类型的错误消息:OpenCV: FFMPEG: tag 0x43564144/'DAVC' is not supported with codec id 28 and format 'mp4 / MP4 (MPEG-4 Part 14)'
      • 你添加了raspberry标签,希望rasp大佬能给出更具体的建议-硬件加速等。我在Windows系统上使用旧的Atom处理器并选择XVID来制作视频。存在性能问题使用 1024x600 模式,但分辨率不低。
      猜你喜欢
      • 2015-10-08
      • 2019-06-15
      • 2014-02-07
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      相关资源
      最近更新 更多