视频播放速度比预期快很多

时间:2015-09-22 00:38:00

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

我知道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,视频播放似乎正常,但我不想这样做,因为它必须与许多相机一起工作。

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

2 个答案:

答案 0 :(得分:2)

@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网络摄像头。

答案 1 :(得分:1)

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

<强>增加: 我想,你会搜索哪些编解码器对Raspberry最有效,并检查你的平台上opencv是否使用了像ffmpeg这样的其他库。