我知道 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/