OpenCV – cамая популярная библиотека компьютерного зрения – её мы будем использовать для чтения и записи видеофайлов. Пример использования недавно публиковался в Библиотеке программиста. Чтобы установить OpenCV, используйте pip :
FFmpeg – кроссплатформенное ПО для записи, конвертации и стриминга аудио и видео. Мы будем использовать FFmpeg для объединения нескольких видеофайлов. Страница загрузки.
Давайте импортируем необходимые библиотеки:
Подробная информация об используемых библиотеках:
- cv2: библиотека OpenCV, чтобы читать и писать видеофайлы;
- time: получаем текущее время для расчета времени выполнения кода;
- subprocess: запускаем новые процессы, подключаемся к их каналам input/output/error и забираем их коды возврата.
- multiprocessing: распараллеливаем выполнение функции для нескольких входных значений и распределяем входные данные между процессами;
- xailient: библиотека для распознавания лиц. Вы можете использовать для этой цели любую библиотеку, например face_recognition, но в нашем примере используется эта.
Начнем с метода обработки видео в одном процессе. Именно так мы обычно читаем видеофайл, обрабатываем каждый кадр и записываем выходные кадры обратно на диск.
Давайте создадим еще одну функцию, которая вызывает видеопроцессор, фиксирует время начала и конца, вычисляет время, необходимое для выполнения обработки и количество обработанных кадров в секунду.
Теперь определим другую функцию, использующую многопроцессорную обработку:
В приведенной функции описана обработка, которая обычно выполняется с помощью одного процесса, но теперь она делится поровну между общим количеством процессоров, доступных на исполняющем устройстве.
Если существует 4 процесса, а общее количество кадров в обрабатываемом видео равно 1000, то каждый процесс получает 250 кадров для обработки, которые выполняются параллельно. В итоге каждый процесс создаст отдельный выходной файл с видео. Чтобы объединить эти файлики мы будем использовать ffmpeg.
Теперь создаем конвейер для запуска многопроцессорной обработки видео, расчета времени выполнения и кадров, обрабатываемых в секунду.
Эксперимент проводился на Lenovo Yoga 920 с Ubuntu18.04. Количество доступных на устройстве логических процессоров – 8шт.
Из этого эксперимента мы можем сделать вывод, что при использовании всех ядер обрабатывается в 2 раза больше кадров в секунду. Чем больше процессоров на тестовой машине, тем больше можно реализовать процессов, и тем быстрее пройдет процесс обработки.