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

时间:2019-10-07 06:16:16

标签: python image opencv 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()

2 个答案:

答案 0 :(得分:0)

docs中指出:

  

注意

     

此函数后应显示waitKey函数   图像指定的毫秒数。否则,它将不会显示   图片。例如,waitKey(0)将无限显示窗口   直到有任何按键(适合图像显示)。 waitKey(25)   将显示25毫秒的帧,之后将显示   自动关闭。 (如果将其循环播放以阅读视频,它将   逐帧显示视频)

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

import cv2

cap = cv2.VideoCapture('video.mp4')
frameTime = 10 # time of each frame in ms, you can add logic to change this value.
while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(frameTime) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

或者,由于帧解码是最耗时的任务,因此您可以将其移至第二个线程并使用已解码帧队列。有关详情,请参见此link

第三种方法是将抓取和解码过程分开,并仅对第n个帧进行解码。这将导致仅显示源视频中的一部分帧,但从用户角度来看,视频将播放得更快。

import cv2

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

答案 1 :(得分:0)

您可以使用ffmpeg使用“演示时间戳”来像快速转发一样加快(或减慢)视频的播放速度。

为加快速度,示例如下:

ffmpeg -i YOUR_INPUT_MOVIE.mp4 -vf  "setpts=0.20*PTS" YOUR_OUTPUT_MOVIE.mp4

这将使电影播放速度提高5倍。

为了降低速度,一个例子是:

ffmpeg -i YOUR_INPUT_MOVIE.mp4 -vf  "setpts=5*PTS" YOUR_OUTPUT_MOVIE.mp4

这会使您的电影放慢5倍。

注意:此方法会丢帧。