# You can find the English version of this tutorial here
Как встроить (восстановить) дату и время на видео с помощью Blender? Как запустить рендер и сохранить отрендеренное изображение с помощью Python? Как работать с датой и временем в Python? — этим вопросам посвящён данный урок.
Результат будет выглядеть так:
Имеется видео, на которое нужно встроить дату и время съёмки (с обновлением в реальном времени).
Сами дата и время известны – их можно посмотреть в свойствах файла:
Осталось встроить его на видео.
Для этого будем использовать Python и Blender 2.8. Можно использовать и более ранние версии Blender, но объект Text, который мы будем использовать в видеоредакторе Blender’а, в более ранних версиях не позволяет выбрать гарнитуру, поэтому воспользуемся бетой Blender 2.8.
Открываем видеоредактор Blender'а. Добавляем текст (Add → Text). В N-панели настраиваем цвет, гарнитуру, размер шрифта.
Откроем дополнительное окно – Text Editor, создаём новый файл и сохраняем его с расширением py.
Алгоритм работы следующий:
0. Нужно пройти от всему таймлайну, от первого до последнего кадра;
1. в каждом кадре нужно будет менять добавленный в видеоредакторе текст на дату и время, рендерить кадр и сохранять полученный результат;
2. каждые 25 кадров (при условии, что наше видео 25 кадров в секунду) прибавлять к текущему времени 1 секунду, после чего сбрасывать счётчик кадров и начинать отсчитывать следующие 25 кадров.
Всё перечисленное будем делать кодом. Вставляем в Text Editor следующий код:
import bpy from datetime import datetime, timedelta import datetime from time import sleep # Исходные дата и время. В данном примере - 13.08.2018, 10:50:10 srcTime = datetime.datetime(2018, 8, 13, 10, 50, 10) # год, месяц, день, час, минута и секунда fps = 25 # FPS видео secFPS = 0 # secFPS будет считать количество пройденных кадров. Если оно достигло fps (в данном случае это 25) - значит, надо прибавить ко времени одну секунду и сбросить счётчик # Запускаем перебор всех кадров от 1 до конца # bpy.data.scenes['Scene'].frame_end - общее количество кадров for i in range(1, bpy.data.scenes['Scene'].frame_end-1): # Проверяем, не дошёл ли ещё secFPS до 25 # Если НЕ дошёл... if secFPS <= fps-1: # счёт с нуля, поэтому нужно вычесть единицу, чтобы 25 кадров не превратились в 26 # ... в текст, добавленный в видеоредакторе ранее, вписываем текущее время (из srcTime) # с помощью strftime преобразуем дата и время преобразуются в формат ДД.ММ.ГГГГ ЧЧ:ММ:СС bpy.data.scenes['Scene'].sequence_editor.sequences_all['Text'].text = srcTime.strftime("%d.%m.%Y %H:%M:%S") # рендерим bpy.ops.render.render(use_viewport=True) # сохраняем результат (с уникальным именем "file + номер текущего кадра + расширение" # в данном случае скрипт запускается под GNU/Linux, в других системах путь может начинаться с C:\ или чего-то похожего bpy.data.images["Render Result"].save_render("/tmp/file"+str(i)+".png") # прибавляем к счётчику кадров единицу secFPS = secFPS + 1 # Если ДОШЁЛ else: # К исходному времени прибавляем 1 секунду srcTime = srcTime + timedelta(seconds=1) # в текст, добавленный в видеоредакторе ранее, вписываем текущее время (которое теперь увеличилось на 1 секунду) bpy.data.scenes['Scene'].sequence_editor.sequences_all['Text'].text = srcTime.strftime("%d.%m.%Y %H:%M:%S") # рендерим bpy.ops.render.render(use_viewport=True) # сохраняем результат bpy.data.images["Render Result"].save_render("/tmp/file"+str(i)+".png") # сбрасываем счётчик secFPS = 0
Жмём Run Script. Будет сгенерирован набор картинок (Image Sequence), который можно будет наложить на оригинальное видео в том же видеоредакторе Blender.
© Denis Skiba aka Mapper720
16.04.2019