Python Opencv自定义控制(增加/减少)视频播放速度

vis*_*hal 3 python opencv image detection

我正在编写一个程序来控制视频播放速度为自定义速率。

有办法实现这一点吗?

应该添加什么代码来控制播放速度?

import cv2

cap = cv2.VideoCapture('video.mp4')

while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

Pio*_*ski 5

在文档中指出:

\n\n
\n

笔记

\n\n

此函数后面应跟随 waitKey 函数,该函数将图像显示指定的毫秒时间。否则,它将\xe2\x80\x99t 显示该图像。例如,waitKey(0)将无限地显示窗口,直到按下任何按键(适合图像显示)。waitKey(25)\n 将显示一帧 25 毫秒,之后显示将自动关闭。(如果您将其放入循环中来读取视频,它将\n逐帧显示视频)

\n
\n\n

In cv2.waitKey(X)functionX表示图像在屏幕上显示的毫秒数。在您的情况下,它设置为 1,因此理论上您可以达到 1000 fps(每秒帧数)。但帧解码需要花费VideoCapture对象时间并限制帧速率。要更改播放速度,您需要声明变量并将其用作函数中的参数waitKey。

\n\n
import cv2\n\ncap = cv2.VideoCapture(\'video.mp4\')\nframeTime = 10 # time of each frame in ms, you can add logic to change this value.\nwhile(cap.isOpened()):\n    ret, frame = cap.read()\n    cv2.imshow(\'frame\',frame)\n    if cv2.waitKey(frameTime) & 0xFF == ord(\'q\'):\n        break\ncap.release()\ncv2.destroyAllWindows()\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,由于帧解码是最耗时的任务,您可以将其移至第二个线程并使用解码帧队列。请参阅此链接了解详细信息。

\n\n

第三种方法是将抓取和解码过程分开,简单地解码每第n帧。这将导致仅显示源视频中的帧的子集,但从用户的角度来看,视频的播放速度会更快。

\n\n
import cv2\n\ncap = cv2.VideoCapture(\'video.mp4\')\ni=0 #frame counter\nframeTime = 1 # time of each frame in ms, you can add logic to change this value.\nwhile(cap.isOpened()):\n    ret = cap.grab() #grab frame\n    i=i+1 #increment counter\n    if i % 3 == 0: # display only one third of the frames, you can change this parameter according to your needs\n        ret, frame = cap.retrieve() #decode frame\n        cv2.imshow(\'frame\',frame)\n        if cv2.waitKey(frameTime) & 0xFF == ord(\'q\'):\n            break\ncap.release()\ncv2.destroyAllWindows()\n
Run Code Online (Sandbox Code Playgroud)\n