Home > database >  Get current video playing position using cv2 in Python
Get current video playing position using cv2 in Python

Time:10-15

I'm trying to get the current playing time position ( in milliseconds if possible) from a playing video using CV2 with Python.

Currently I'm using this sample code to play the video file

import cv2
import numpy as np

file_name = "2.mp4"
window_name = "window"
interframe_wait_ms = 30

cap = cv2.VideoCapture(file_name)
if not cap.isOpened():
    print("Error: Could not open video.")
    exit()

cv2.namedWindow(window_name, cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty(window_name, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)

  while (True):
      ret, frame = cap.read()
      if not ret:
          print("Reached end of video, exiting.")
          break

      cv2.imshow(window_name, frame)
      if cv2.waitKey(interframe_wait_ms) & 0x7F == ord('q'):
          print("Exit requested.")
          break

cap.release()
cv2.destroyAllWindows()

Is there a way to get this value or calculate it, it has to represent what's the position (in time, i.e 12.500 seconds of 24.000 seconds video) of the playback at the request time.

Thanks!

CodePudding user response:

Yes, this can be achieved by querying the video FPS using VideoCapture.get(cv2.CAP_PROP_FPS) and keeping track of the frame index.

Example:

file_name = "2.mp4"
window_name = "window"
interframe_wait_ms = 30

cap = cv2.VideoCapture(file_name)
if not cap.isOpened():
    print("Error: Could not open video.")
    exit()
fps = cap.get(cv2.CAP_PROP_FPS)
cv2.namedWindow(window_name, cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty(window_name, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
frame_index = 0
while True:
    ret, frame = cap.read()

    if not ret:
        print("Reached end of video, exiting.")
        break

    cv2.imshow(window_name, frame)
    print(F"playback time: {(frame_index/fps)*1000}ms")
    if cv2.waitKey(interframe_wait_ms) & 0x7F == ord('q'):
        print("Exit requested.")
        break

    frame_index  = 1

cap.release()
cv2.destroyAllWindows()
  • Related