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

2024-02-13

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

有办法实现这一点吗?

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

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()

In the docs https://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html?highlight=waitkey据称:

Note

该函数后面应该有 waitKey 函数,该函数显示 指定毫秒的图像。否则不会显示 图像。例如,waitKey(0)将无限显示窗口 直到任何按键(适合图像显示)。等待键(25) 将显示一帧 25 毫秒,之后显示 自动关闭。 (如果你把它放在一个循环中来读取视频,它会 逐帧显示视频)

In 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 https://www.pyimagesearch.com/2017/02/06/faster-video-file-fps-with-cv2-videocapture-and-opencv/了解详情。

第三种方法是将抓取和解码过程分开,简单地解码每第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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐