Python Opencv控制(increase/decrease)视频播放速度自定义
Python Opencv control (increase/decrease) the video playback speed as custom
我正在编写一个程序来将视频播放速度控制为自定义速率。
有什么办法可以实现吗?
应该添加什么代码来控制播放速度?
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()
在 docs 中指出:
Note
This function should be followed by waitKey function which displays
the image for specified milliseconds. Otherwise, it won’t display the
image. For example, waitKey(0) will display the window infinitely
until any keypress (it is suitable for image display). waitKey(25)
will display a frame for 25 ms, after which display will be
automatically closed. (If you put it in a loop to read videos, it will
display the video frame-by-frame)
在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()
您可以使用 ffmpeg 来加快(或减慢)您的视频,例如使用 "presentation time stamps" 快进。
为了加快一个例子:
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 倍。
注意:此方法会掉帧。
我正在编写一个程序来将视频播放速度控制为自定义速率。
有什么办法可以实现吗?
应该添加什么代码来控制播放速度?
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()
在 docs 中指出:
Note
This function should be followed by waitKey function which displays the image for specified milliseconds. Otherwise, it won’t display the image. For example, waitKey(0) will display the window infinitely until any keypress (it is suitable for image display). waitKey(25) will display a frame for 25 ms, after which display will be automatically closed. (If you put it in a loop to read videos, it will display the video frame-by-frame)
在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()
您可以使用 ffmpeg 来加快(或减慢)您的视频,例如使用 "presentation time stamps" 快进。
为了加快一个例子:
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 倍。
注意:此方法会掉帧。