Как встроить (восстановить) дату и время на видео с помощью Blender

# 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