Документация Engee
Notebook

Обработка видео

Открыть пример в Engee

В данной демонстрации посмотрим, что можно сделать с видео посредством Engee. Для этого поработаем с видеороликом, взятым из Интернета. Видео представлено ниже.

In [ ]:
Pkg.add("VideoIO") # Библиотека обработки видеопотока
   Resolving package versions...
  No Changes to `/user/.project/Project.toml`
  No Changes to `/user/.project/Manifest.toml`
In [ ]:
using VideoIO # Библиотека обработки видео
using ImageShow # Библиотека отрисовки изображений
using StackViews # Библиотека обработки множеств
using ImageFiltering # Библиотека фильтрации изображений

Далее, используя функцию VideoIO.load, загружаем имя файла в память как вектор массивов изображений. А при помощи StackView мы выполним преобразования вектора в многомерную матрицу.

In [ ]:
path = @__DIR__ # Возвращает путь до папки открытой в файловом менеджере
path_video = "$path/input.mp4"
Out[0]:
"/user/start/examples/image_processing/video_processing/input.mp4"
In [ ]:
vid = VideoIO.load( path_video )
Stack = StackView(vid)# Сборка вектора изображений в матрицу
simshow(Stack[:,:,1])# Отрисовка первого кадра видео
Out[0]:
No description has been provided for this image

Из полученной матрицы мы можем вычислить частоту кадров, зная время видео и количество кадров в видео.

Функция get_time_duration возвращает дату и время начала, а также продолжительность видеофайла. Обратите внимание: если дата и время отсутствуют, то функция вернёт 00:00 1 января 1970 г..

Также мы можем узнать размерности кадров и их количество, используя функцию size для стека изображений.

In [ ]:
get_time = VideoIO.get_time_duration(path_video)
Out[0]:
(DateTime("1970-01-01T00:00:00"), 6.016)
In [ ]:
print("All size video: " * string(size(Stack)))
All size video: (720, 1280, 180)
In [ ]:
print("FPS: " * string(size(Stack,3)/floor(get_time[2])))
FPS: 30.0

Обрежем видео, оставив только центральную его часть.

In [ ]:
new_video = Stack[1:360,1:640,:]

for i in 1:size(Stack,3)
new_video[:,:,i] = Stack[180:180+359,320:320+639,i]
end

simshow(new_video[:,:,1])# Отрисовка первого кадра видео
Out[0]:
No description has been provided for this image

Теперь на первые 100 кадров обрезанного видео добавим фильтрацию для создания эффекта размытия.

In [ ]:
for i in 1:100
new_video[:,:,i] = imfilter(new_video[:,:,i], Kernel.gaussian(3))
end

simshow(new_video[:,:,1])# Отрисовка первого кадра видео
Out[0]:
No description has been provided for this image

Если мы хотим сохранить наши данные в видео, то есть опция напрямую сохранить стек изображений в форме видеофайла. При этом мы можем самостоятельно настроить параметры кодировщика и частоту кадров. Список имеющихся настроек представлен в таблице ниже.

In [ ]:
video = [zeros(eltype(new_video), size(new_video, 1), size(new_video, 2)) for _ in axes(new_video, 3)]

@inbounds for k in axes(new_video, 3)
       video[k] = new_video[:,:,k]
end
Цель encoder_options
Перцептивное сжатие, по умолчанию h264. Лучшее решение для большинства случаев (crf=23, preset="medium")
Сжатие без потерь. Самый быстрый, самый большой размер файла (crf=0, preset="ultrafast")
Сжатие без потерь. Самый медленный, минимальный размер файла (crf=0, preset="veryslow")
Прямое управление битрейтом и частотой внутри кадров (bit_rate = 400000, gop_size = 10, max_b_frames = 1)
In [ ]:
encoder_options = (crf=23, preset="medium")
VideoIO.save("video.mp4", video, framerate=30, encoder_options=encoder_options)
In [ ]:

Вывод

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