📹 Автоматизация рендеринга на основе данных для After Effects

Вы когда-нибудь задумывались о задачах / вещах, отнимающих ваше драгоценное время? Например, создание нескольких похожих проектов Adobe After Effects. Или ожидая рендеринга первого проекта, чтобы начать работу над другим. Или даже распараллелить процесс для более быстрого рендеринга ваших бесценных видеопродуктов? Бьюсь об заклад, вы это сделали. Так почему бы не автоматизировать вещи?

Этот пост посвящен инструменту с открытым исходным кодом, который может помочь вам в решении вашей проблемы. Он называется nexrender. По сути, это приложение командной строки, которое позволяет автоматически отображать предварительно созданные проекты Adobe After Effects . Внутри он по-прежнему использует собственное приложение Adobe aerender cli для рендеринга, однако не запускает полный графический интерфейс для After Effects.

Функции

  • управляемый данными, динамический, персонализированный рендеринг видео
  • автоматизированное управление, обработка и доставка видео
  • сетевая структура проекта, рендер-ферма
  • высокомодульный характер, обширная поддержка плагинов
  • работает только в режиме cli, никогда не запускает приложение After Effects GUI
  • не требует лицензий для Adobe After Effects на любом рабочем компьютере
  • бесплатно в использовании и с открытым исходным кодом

Системные Требования

  1. 64-битная операционная система на базе Windows / macOS.
  2. Установил Adobe After Effects.
  3. Базовые навыки работы с терминалом и javascript / json.

Настройка потока

Инструмент распространяется в нескольких различных форматах, однако в нашем случае мы сосредоточимся на предварительно созданных двоичных файлах для конкретных ОС.

Скачивание двоичных файлов

Перейдите в раздел релизов и возьмите двоичный файл nexrender-cli- {Your-OS} из раздела последних релизов. Сохраните его в папке по вашему выбору и откройте терминал, указывающий на эту папку.



Затем мы собираемся создать файл JSON, который будет инструкцией для нашей работы.

Работа - это единая рабочая единица в экосистеме nexrender. Это json-документ, в котором описывается, что и как нужно делать. Минимальное описание должности всегда должно содержать указатель на проект Adobe After Effects, который необходимо визуализировать, и композицию, которая будет использоваться для визуализации.

Давайте создадим нашу первую работу:

// myjob.json
{
    "template": {
        "src": "file:///users/myuser/documents/myproject.aep",
        "composition": "main"
    }
}

Предполагая, что вы подготовили (или взяли какой-то существующий файл проекта AEP), мы можем начать рендеринг самого себя:

$ nexrender-cli --file myjob.json

При вызове этой линии будет предпринята попытка найти настоящую папку установки Adobe After Effects в тех местах, где она обычно находится. Однако, если вы точно знаете, что он установлен в другой папке, укажите этот путь к двоичному файлу aerender.exe вручную (для систем macOS и Windows соответственно):

$ nexrender-cli --file myjob.json --binary="/Directory/aerender"
$ nexrender-cli.exe --file myjob.json --binary="d:/dir/aerender.exe"

Примечание: рекомендуется запустить nexrender-cli --help хотя бы один раз, чтобы прочитать всю полезную информацию о доступных параметрах.

Кроме того, если вы работаете в системе Windows и After Effects установлен где-то на диске C: вашей системы, вам может потребоваться запустить nexrender-cli.exe из консоли с правами администратора. Хотя бы один раз.

Ресурсы

Мы успешно отрендерили статический файл проекта с помощью nexrender, однако в этом нет особого смысла, если мы не собираемся добавлять в микс динамические данные.

Чтобы реализовать что-то подобное, нужно добавить asset к нашему определению задания:

// myjob.json
{
    "template": {
        "src": "file:///d:/documents/myproject.aep",
        "composition": "main"
    },
    "assets": [
        {
            "src": "file:///d:/images/myimage.png",
            "type": "image",
            "layerName": "background.png"
        }
    ]
}

Что мы там сделали, так это сказали nexrender использовать конкретный актив в качестве замены тому, что мы определили в нашем aep проекте. В частности, когда должен произойти рендеринг, nexrender скопирует / загрузит этот файл ресурса и попытается найти и заменить запись footage на указанное имя слоя.

Примечание: активы могут быть доставлены в nexrender несколькими способами, file: // - только один из них, для получения дополнительной информации: подробная информация об элементах видеоряда.

Действия

Вы могли заметить, что если вы не добавили флаг --skip-cleanup в нашу команду, все обработанные результаты будут удалены, и каждый раз, когда вы попытаетесь запустить nexrender-cli с нашим заданием, будет отображаться большое предупреждающее сообщение.

Причина в том, что мы не определили никаких действий, которые нам нужно выполнить после того, как мы закончили фактический рендеринг. Давайте исправим это и добавим несколько действий: закодировать и скопировать:

// myjob.json
{
    "template": {
        "src": "http://example.com/assets/myproject.aep",
        "composition": "main"
    },
    "assets": [
        {
            "src": "http://example.com/assets/myimage.png",
            "type": "image",
            "layerName": "background.png"
        }
    ],
    "actions":{
        "postrender": [
            {
                "module": "@nexrender/action-encode",
                "preset": "mp4",
                "output": "encoded.mp4"
            },
            {
                "module": "@nexrender/action-copy",
                "input": "encoded.mp4",
                "output": "d:/mydocuments/results/myresult.mp4"
            }
        ]
    }
}

Мы только что добавили пару postrender действий, которые произойдут сразу после того, как мы закончим рендеринг. Модуль, который мы описали в каждом из этих случаев, будет отвечать за кодирование вывода в указанный формат и копирование файла результатов из временной папки в папку output соответственно.

У каждого модуля может быть свой собственный набор полей, однако поле amodule всегда присутствует.

Также вы могли заметить, что actions - это объект, однако мы описали в нем только одно (postrender) поле. И есть еще один, он называется prerender. Последний может использоваться для обработки данных / активов непосредственно перед началом фактического рендеринга.

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

Если у вас есть хоть какой-то опыт работы с Node.js, вы могли заметить, что определение module выглядит точно так же, как имя пакета. И что ж, да, это так. Когда nexrender натыкается на запись module, он пытается запросить этот пакет из внутреннего хранилища, а затем, если модуль не был найден, он попытается найти глобально установленные модули Node.js с этим именем.

Это означает, что если вам удобно писать Node.js код, вы можете легко создать свой собственный модуль и использовать его, указав либо абсолютный / относительный путь (на локальном компьютере), либо опубликовав модуль и установив его глобально на целевом компьютере.

Видео уроки

Вот несколько коротких примеров видео, сделанных нашим сообществом:

Подробности

Большинство полей просто проксируются в двоичный файл aerender, и их описания и значения по умолчанию можно проверить здесь.

onChange - это поле, которое можно настроить только программно. Это обратный вызов, который будет запускаться каждый раз при изменении состояния задания (происходит при каждом изменении задачи). Для получения дополнительной информации обратитесь к исходному коду.

Как это работает

  • рендеринг: он использует интерфейс командной строки Adobe After Effects aerender.
  • композитинг: он создает временную папку, копирует проект и заменяет ресурсы предоставленными.
  • персонализация: он использует выражения, скрипты и композицию AE (указано выше).
  • планирование: он хранит проекты в локальной базе данных, управляемой из любого места с помощью http api.
  • сеть: визуализирует проект для каждой машины и может использоваться для одновременной визуализации нескольких проектов.
  • ферма: может использоваться для рендеринга одного проекта на нескольких машинах с помощью Multi-Machine Sequence.

Шаблонный рендеринг

Одним из основных преимуществ использования nexrender является возможность визуализировать проекты с использованием данных, отличных от тех, которые использовались при создании проекта. Данные означают любой источник / видеоматериал, это могут быть изображения, аудиодорожки, видеоклипы, текстовые строки, значения для цветов / позиций, даже динамическая анимация с использованием выражений. Все эти вещи можно заменить для каждого задания, даже не открывая файл проекта или не запуская After Effects.

Примечание. Этот процесс также можно называть по-другому: шаблонное, управляемое данными или динамическое создание видео.

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

Предметы видеозаписи

Замена элементов видеоряда - это то, что вкратце описано в разделе Job этого документа. Идея довольно проста: вы описываете, какой актив заменит существующий описанный элемент видеоряда в определенном слое, указывая src и один из параметров layerName или layerIndex.

Поля

  • src: строка, указатель URI на конкретный ресурс, проверьте поддерживаемые протоколы
  • type: строка для элементов видеоряда является одним из (image, audio, video)
  • layerName: строка, имя целевого слоя в проекте After Effects
  • layerIndex: целое число, может использоваться вместо layerName для выбора слоя путем предоставления индекса, начиная с 1 (поведение по умолчанию для среды сценариев AE jsx)
  • composition: строка, композиция, в которой находится слой, полезна для поиска слоя в предварительных композициях. Если ничего не указано, используется композиция по умолчанию, заданная в шаблоне. Предоставление "*" приведет к сопоставлению композиции с подстановочными знаками и будет применять эти данные к каждому совпадающему слою в каждой подходящей композиции.

Указанный ресурс из поля src будет загружен / скопирован в рабочий каталог, и непосредственно перед тем, как произойдет рендеринг, элемент видеоряда с указанными layerName или layerIndex в исходном проекте будет заменен только что загруженным ресурсом.

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

Примечание. Если для ресурса файла видеоряда используется layerName, он всегда должен содержать расширение в имени.

Пример

{
    "assets": [
        {
            "src": "https://example.com/assets/image.jpg",
            "type": "image",
            "layerName": "MyNicePicture.jpg"
        },
        {
            "src": "file:///home/assets/audio.mp3",
            "type": "audio",
            "layerIndex": 15
        }
    ]
}

Элементы данных

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

Поля

  • type: строка для элементов данных всегда data
  • layerName: строка, имя целевого слоя в проекте After Effects
  • layerIndex: целое число, может использоваться вместо layerName для выбора слоя путем предоставления индекса, начиная с 1 (поведение по умолчанию для среды сценариев AE jsx)
  • property: строка, указывающая, какое свойство слоя вы хотите изменить.
  • value: смешанный, необязательный, указывает, какое значение вы хотите установить для указанного свойства
  • expression: строка, необязательная, позволяет указать выражение, которое может выполняться в каждом кадре для вычисления значения
  • composition: строка, композиция, в которой находится слой, полезна для поиска слоя в предварительных композициях. Если ничего не указано, используется композиция по умолчанию, заданная в шаблоне.

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

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

Пример

{
    "assets": [
        {
            "type": "data",
            "layerName": "MyNicePicture.jpg",
            "property": "Position",
            "value": [500, 100]
        },
        {
            "type": "data",
            "layerName": "my text field",
            "property": "Source Text",
            "expression": "time > 100 ? 'Bye bye' : 'Hello world'"
        },
        {
            "type": "data",
            "layerIndex": 15,
            "property": "Scale",
            "value": [0,0],
            "expression": "[time * 0.1, time * 0.1]"
        }
    ]
}

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

Элементы сценария

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

Теперь настоящая сложность возникает только со стороны реального сценария, вам нужно иметь некоторые базовые знания ExtendScript Toolkit, а со стороны nexrender все довольно просто. Вам нужно только указать src, указывающий на ресурс сценария, и установить правильный тип.

Поля

Пример

{
    "assets": [
        {
            "src": "http://example.com/scripts/myscript.jsx",
            "type": "script"
        }
    ]
}

Это в значительной степени охватывает основы шаблонного рендеринга.

Сетевой рендеринг

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

С помощью nexrender вы можете довольно быстро и легко развернуть свой собственный кластер рендеринга.

Использование двоичных файлов

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

nexrender-server

Описание:

Приложение CLI, которое отвечает за управление заданиями, взаимодействие рабочих узлов, связь с экземплярами nexrender-worker и служит главным образом производителем в сетевой модели nexrender.

Технически говоря, это очень крошечный HTTP-сервер, работающий с минимальной версией REST API.

Поддерживаемые платформы:

Windows, macOS, Linux

Требования:

Никто

Пример

$ nexrender-server \
        --port=3050 \
        --secret=myapisecret

Больше информации:



nexrender-worker

Описание:

Приложение CLI, которое отвечает в основном за фактическую обработку и рендеринг заданий, связь с nexrender-server и служит главным образом потребителем в сетевой модели nexrender.

Поддерживаемые платформы:

Windows, macOS

Требования:

Установлена ​​лицензионная / пробная версия Adobe After Effects.

Пример

$ nexrender-worker \
        --host=https://my.server.com:3050 \
        --secret=myapisecret

Примечание: рекомендуется запустить nexrender-worker -h хотя бы один раз, чтобы прочитать всю полезную информацию о доступных параметрах.

Больше информации:



Использование API

Теперь, после того как вы загрузили свои рабочие и серверные узлы, им нужно будет отправить некоторые задания на сервер, чтобы начать фактический рендеринг. Это можно сделать двумя основными способами. Первый - просто отправить прямой запрос POST, чтобы добавить задание на сервер.

Другой вариант - использовать уже созданный модуль API для js:

npm install @nexrender/api --save

Больше информации:



Протоколы

Поле src - это строка URI, которая описывает путь, указывающий на конкретный ресурс. Он поддерживает несколько разных протоколов:

  • file:// - файл в локальной файловой системе
  • http:// - файл на удаленном http сервере
  • https:// - файл на удаленном http-сервере, обслуживаемый по https
  • data:// - данные в кодировке URI, могут быть base64 или обычный текст
  • s3:// - @ nexrender / provider-s3 - провайдер Amazon S3

Надеюсь, эта статья помогла вам лучше понять, как использовать nexrender для создания динамического шаблонного видеоконтента и автоматизировать рабочий процесс с контентом.

По любым вопросам, сообщениям об ошибках и более подробной информации обращайтесь к исходному репозиторию GitHub:



Удачного взлома! :)