Вопрос или проблема
Я использую библиотеку 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. Вот несколько рекомендаций:
-
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()
-
imageio: Библиотека, которая может использовать FFmpeg в качестве бэкенда для ускоренного доступа к кадрам. Она также поддерживает чтение видеофайлов, и доступ к ним достаточно прост.
import imageio reader = imageio.get_reader('your_video.mov') # Получить кадр по индексу frame = reader.get_data(1000)
-
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)
-
PyAV: Это обертка над библиотекой FFmpeg и является более производительной альтернативой для доступа к видео. PyAV позволяет не только читать кадры, но и манипулировать ими.
import av container = av.open('your_video.mov') for frame in container.decode(video=0): if frame.index == 1000: # здесь можно обработать кадр break
-
Reducing Resolution: Если скорость все еще остается проблемой, вы можете рассмотреть возможность уменьшения разрешения при считывании кадров. Используя такие методы, как изменение размера кадра в OpenCV или другие библиотеки, вы сможете заметно сократить время обработки.
Все эти решения обеспечивают более быстрый доступ к кадрам по сравнению с pims. Выбор конкретного подхода будет зависеть от вашей конечной цели и необходимых вам возможностей (например, обработки видео в реальном времени или анализа на основе кадра).