CAP_PROP_POS_FRAMES is abnormal slow

that video is 60 fps, 4K, with GOPs that are 250 frames long (~4 seconds).

such long GOP sizes will cost you when you jump to exact timestamps.

I ran your code on my computer from 2012. it’s going to be slow to decode 4K content.

Python-Version 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)]
OpenCV-Version 4.7.0
Task: read 600 frames
21.572s - 27.812fps

Jump to frame 400: 0.031s
Jump to frame 800: 1.687s
Jump to frame 1200: 0.607s
Jump to frame 1600: 2.18s
Jump to frame 2000: 1.161s

these times are within my expectations. for every jump, it has to decode upto 250 frames before it reaches the exact desired time. with my old computer, this decoding will take a moment. it is a bounded amount of work though.

I don’t know what’s taking several seconds in your code or why the effort should grow.

try your code with VideoCapture(..., apiPreference=cv.CAP_FFMPEG) to make sure gstreamer isn’t interfering.

here’s some more info:

for framei in range(0, 1000, 20):
    t0 = time.perf_counter()
    vs.set(cv2.CAP_PROP_POS_FRAMES, framei)
    t1 = time.perf_counter()
    dt = t1 - t0
    print(f"jump to {framei:3d}: {dt:.3f} s", "*" * int(round(dt/0.1)))
jump to   0: 0.029 s
jump to  20: 0.281 s ***
jump to  40: 0.529 s *****
jump to  60: 0.807 s ********
jump to  80: 0.954 s **********
jump to 100: 1.102 s ***********
jump to 120: 1.399 s **************
jump to 140: 1.654 s *****************
jump to 160: 1.985 s ********************
jump to 180: 2.055 s *********************
jump to 200: 2.248 s **********************
jump to 220: 2.502 s *************************
jump to 240: 2.740 s ***************************
jump to 260: 2.889 s *****************************
jump to 280: 0.418 s ****
jump to 300: 0.664 s *******
jump to 320: 0.884 s *********
jump to 340: 1.088 s ***********
jump to 360: 1.263 s *************
jump to 380: 1.453 s ***************
jump to 400: 1.664 s *****************
jump to 420: 1.972 s ********************
jump to 440: 2.093 s *********************
jump to 460: 2.395 s ************************
jump to 480: 2.772 s ****************************
jump to 500: 3.023 s ******************************
jump to 520: 0.365 s ****
jump to 540: 0.569 s ******
jump to 560: 0.862 s *********
jump to 580: 1.002 s **********
jump to 600: 1.182 s ************
jump to 620: 1.386 s **************
jump to 640: 1.694 s *****************
jump to 660: 1.816 s ******************
jump to 680: 2.033 s ********************
jump to 700: 2.286 s ***********************
jump to 720: 2.678 s ***************************
jump to 740: 2.785 s ****************************
jump to 760: 2.897 s *****************************
jump to 780: 0.427 s ****
jump to 800: 0.672 s *******
jump to 820: 0.980 s **********
jump to 840: 1.509 s ***************
jump to 860: 1.947 s *******************
jump to 880: 2.043 s ********************
jump to 900: 2.141 s *********************
jump to 920: 2.723 s ***************************
jump to 940: 2.359 s ************************
jump to 960: 3.070 s *******************************
jump to 980: 3.107 s *******************************
for timestamp in np.arange(0, 15.0, 0.5):
    t0 = time.perf_counter()
    vs.set(cv2.CAP_PROP_POS_MSEC, int(round(timestamp * 1000)))
    t1 = time.perf_counter()
    dt = t1 - t0
    print(f"jump to {timestamp:.3f}s: {dt:.3f} s", "*" * int(round(dt/0.1)))
jump to 0.000s: 0.147 s *
jump to 0.500s: 0.379 s ****
jump to 1.000s: 0.740 s *******
jump to 1.500s: 1.080 s ***********
jump to 2.000s: 1.371 s **************
jump to 2.500s: 1.948 s *******************
jump to 3.000s: 2.447 s ************************
jump to 3.500s: 2.879 s *****************************
jump to 4.000s: 3.389 s **********************************
jump to 4.500s: 0.365 s ****
jump to 5.000s: 0.681 s *******
jump to 5.500s: 1.513 s ***************
jump to 6.000s: 1.432 s **************
jump to 6.500s: 1.952 s ********************
jump to 7.000s: 1.916 s *******************
jump to 7.500s: 2.178 s **********************
jump to 8.000s: 2.559 s **************************
jump to 8.500s: 2.969 s ******************************
jump to 9.000s: 0.665 s *******
jump to 9.500s: 0.957 s **********
jump to 10.000s: 1.402 s **************
jump to 10.500s: 1.783 s ******************
jump to 11.000s: 2.090 s *********************
jump to 11.500s: 2.283 s ***********************
jump to 12.000s: 2.856 s *****************************
jump to 12.500s: 3.103 s *******************************
jump to 13.000s: 0.414 s ****
jump to 13.500s: 0.827 s ********
jump to 14.000s: 1.256 s *************
jump to 14.500s: 1.691 s *****************
1 Like