python - 视频播放比预期快很多

标签 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,则视频播放似乎正常,但是我不想这样做,因为它必须与许多摄像机通用。

我现在真的不知道该怎么办,但我会一直寻找直到找到解决方案。任何见识表示赞赏!

最佳答案

@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,并以30 FPS提供1080p。请参阅this question,以了解为什么Raspberry Pi camera module是USB网络摄像头更好的替代方法。

关于python - 视频播放比预期快很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706613/

相关文章:

python - 使用python自动发布到facebook页面

python - 无法理解 numpy argpartition 输出

c++ - 正方形检测找不到正方形

linux - Raspberry Pi - 突然没有 SSH 访问权限

raspberry-pi - 树莓派无法读取USB并且CPU很热

python - Google 云端硬盘文件夹 ID

python - 如何在给定时间记录和保存用户可编辑的 Django 模型实例

opencv - 如何在 JAVA 的 OpenCV 中将编码的图像字符串转换为 Mat?

java - 在 javacv 中将 IplImage 转换为 Mat

c - Raspberry Pi 中的 Uart 较高波特率问题