Библиотека видео на Python с быстрым доступом к кадрам

Вопрос или проблема

Я использую библиотеку pims (https://github.com/soft-matter/pims), чтобы получать кадры из .MOV файла с более чем 25K кадрами, 3840 × 2160, H.264 (High Profile), 60fps. Вот временные затраты на довольно быстром ПК, начиная с открытия файла:

  • кадр #100: 2.97с
  • кадр #1000: 28.39с
  • кадр #10000: 280.19с

Существует ли библиотека с более быстрым временем доступа к кадрам? Она может получить ближайший ключевой кадр, если это ускорит процесс. Также был бы приемлем быстрый доступ к кадрам с уменьшенным разрешением.

Стандартный видеоплеер Ubuntu позволяет мне перематывать вперед/назад с помощью ползунка и реагирует практически мгновенно. Должна быть быстрая библиотека где-то.

Ответ или решение

Для быстрого доступа к кадрам видеофайлов в Python существует несколько библиотек, которые могут улучшить вашу производительность по сравнению с библиотекой pims. Вот несколько рекомендаций:

  1. OpenCV: Эта библиотека широко используется для обработки изображений и видео. Она позволяет быстро считывать кадры благодаря оптимизации работы с видеофайлами. Вы можете использовать метод cv2.VideoCapture() для открытия файла и методы set() и read() для доступа к нужным кадрам. Пример кода:

    import cv2
    
    cap = cv2.VideoCapture('your_video.mov')
    
    # Перейти к требуемому кадру
    frame_number = 1000
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
    
    ret, frame = cap.read()
    if ret:
       cv2.imshow('Frame', frame)
       cv2.waitKey(0)
    cap.release()
  2. imageio: Библиотека, которая может использовать FFmpeg в качестве бэкенда для ускоренного доступа к кадрам. Она также поддерживает чтение видеофайлов, и доступ к ним достаточно прост.

    import imageio
    
    reader = imageio.get_reader('your_video.mov')
    
    # Получить кадр по индексу
    frame = reader.get_data(1000)
  3. FFmpeg: Если вы ищете интеграцию на более низком уровне, вы можете рассмотреть возможность использования FFmpeg напрямую через subprocess. Это даст вам полный контроль над процессом декодирования и позволит извлекать ключевые кадры.

    import subprocess
    
    frame_number = 1000
    command = [
       'ffmpeg',
       '-i', 'your_video.mov',
       '-vf', f'select=eq(n\,{frame_number})',
       '-vframes', '1',
       'output_frame.jpg'
    ]
    subprocess.run(command)
  4. PyAV: Это обертка над библиотекой FFmpeg и является более производительной альтернативой для доступа к видео. PyAV позволяет не только читать кадры, но и манипулировать ими.

    import av
    
    container = av.open('your_video.mov')
    for frame in container.decode(video=0):
       if frame.index == 1000:
           # здесь можно обработать кадр
           break
  5. Reducing Resolution: Если скорость все еще остается проблемой, вы можете рассмотреть возможность уменьшения разрешения при считывании кадров. Используя такие методы, как изменение размера кадра в OpenCV или другие библиотеки, вы сможете заметно сократить время обработки.

Все эти решения обеспечивают более быстрый доступ к кадрам по сравнению с pims. Выбор конкретного подхода будет зависеть от вашей конечной цели и необходимых вам возможностей (например, обработки видео в реальном времени или анализа на основе кадра).

Оцените материал
Добавить комментарий

Капча загружается...