我正在尝试通过 Python 和 ffmpeg 从网络摄像头保存帧,但视频变得太快了

I am trying to save frames from a webcam via Python and ffmpeg, but the video becomes way to fast

我从我的网络摄像头获得了 cv2 图像流,我想将其保存到视频文件中。在玩了一下 cv2.VideoWriter() 之后,发现使用 ffmpeg 会提供更多选项,并且 - 显然,在 SO 上关注一些线程 - 会带来更好的结果。所以我试了一下 VidGear Python library,它似乎工作正常。

不过有一个问题:我的网络摄像头提供可变帧率,大部分时间在 10 到 30 FPS 之间。保存这些帧时,视频文件变得太快了,就像快进观看一样。实时的一分钟变成了视频中的几秒。

我尝试使用 ffmpeg 的 -framerate and/or -r 参数的各种组合,但没有成功。这是我现在正在使用的命令:

ffmpeg -y -f rawvideo -vcodec rawvideo -s 1920x1080 -pix_fmt bgra -framerate 25.0 -i - -vcodec libx265 -crf 25 -r 25 -preset fast <output_video_file>

作为记录,我正在从 VidGear 库创建 WriteGear class,如下所示:

video_params = {
    "-vcodec": "libx265",
    "-crf": 25,
    "-input_framerate": 25,
    "-r": 25,
}
WriteGear(output_filename=video_file, logging=True, **video_params)

知道我在这里做错了什么以及我需要如何调用 ffmpeg 吗?

好的,我现在通过使用 cv2.VideoWriter() 而不是 VidGear 库解决了我的问题。不知道为什么,但我无法让后者以正确的方式工作——要么是我没有正确使用它,要么是库坏了(对于我的用例)。

无论哪种方式,在试用 OpenCV 解决方案后,结果证明使用 VideoWriter class 并从网络摄像头提供 FPS 值现在一切正常。

作为记录,有一点需要注意:即使在为我的平台找到正确的编解码器和 double-checking 要保存的图像尺寸之后,我仍然以“空”(1k ).mp4 视频文件。原因是我的网络摄像头的所有帧都带有 4 个通道,但 VideoWriter class 显然期望帧具有 3 个通道,静静地丢弃所有其他“无效”帧。使用以下代码,我能够转换我的 4 通道图像:

if len(image.shape) > 2 and image.shape[2] == 4:
    image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)