如何使用 openCV 更改现有视频的帧速率 FPS python

How to change frame rate FPS of an existing video using openCV python

我正在尝试更改帧速率,即 python 中使用 openCV 库的现有视频的 FPS。下面是我要执行的代码。即使在使用 cv2.CAP_PROP_FPS 设置 FPS 属性 后,视频在 cv2.imshow() 方法中的播放速度也不会更快。即使设置 FPS 属性 getter returns 旧的 FPS 值。那么如何设置更高的FPS值并使视频播放速度更快呢?

使用的版本: python = 3.7.4 和 opencv-python - 4.1.0.25

import cv2

video = cv2.VideoCapture("yourVideoPath.mp4");
video.set(cv2.CAP_PROP_FPS, int(60))

if __name__ == '__main__':
    print("Frame rate : {0}".format(video.get(cv2.CAP_PROP_FPS)))
    while video.isOpened():
        ret1, frame2 = video.read()
        cv2.imshow("Changed", frame2)

        if cv2.waitKey(10) & 0xFF == ord('q'):  # press q to quit
            break

video.release()
cv2.destroyAllWindows()

如果您只是想在显示的 window 中播放视频,限制因素不是视频的 fps,而是等待代码 waitKey(10) 所花费的时间,这使得程序在每帧之间等待 10 毫秒。

VideoCapture class 的 read() 方法只是 return 下一帧,没有等待或帧速率的概念。唯一阻止此代码 运行 尽可能快的是 waitKey(10) 部分,因此这是决定速度的主要因素。要更改通过 imshow() 方法看到的帧速率,您需要编辑等待时间。这可能是主要因素,但不是唯一的因素,因为读取帧确实需要时间。

如果您实际上是在尝试更改现有文件的播放速率并将其保存到该文件中,我不确定 OpenCV 是否真的支持这个,我想这将取决于您的后端'重新使用 - OpenCV 使用不同的第 3 方后端实现 VideoCapture class。根据 VideoCapture.set() 的文档,我将调查 video.set(cv2.CAP_PROP_FPS, int(60)) 的 return 值作为 documentation suggests 如果这改变了什么,它将 return 为真。

作为替代方案,您可以使用 supports this relatively easily. If you want to stick with OpenCV I know from personal experience you can do this with the VideoWriter class 之类的 FFMPEG 进行调查。在这种方法中,您将使用 VideoCapture class 逐帧读取视频,然后使用 VideoWriter 以所需的帧速率保存它。不过,我怀疑 FFMPEG 可能会满足您的需求!