Скрипты в DaVinci Resolve 16

Около двух недель назад я решил попробовать монтаж видео в DaVinci Resolve. Говорят, каждую серьёзную программу нужно изучать дважды – первый раз её интерфейс, второй раз – этот же интерфейс через скрипты. Исключение составляет, пожалуй, SideFX Houdini – там сразу надо изучать скрипты. Но сегодня речь о DaVinci Resolve: в версии 15 в него включили очень крутой инструмент композитинга (eyeon) Fusion. В котором издавна были скрипты на Lua и Python 2/3. И через включение Fusion как вкладки в DaVinci Resolve, движок скриптования включили в остальной функционал этого комбаина.

Быстрая ретроспектива: до Resolve я некоторое время работал с Final Cut Pro X, Nuke, Natron, Combustion, Edius Pro, Premiere Pro, KDENLive… – в кучу смешал композитинг и монтажки, и по сути сравнить ощущения могу лишь с Nuke. В Natron скриптование появилось лишь недавно, в FCPX скриптования замечено не было, в других редакторах об этом я даже не задумывался. В Nuke всё очень круто и развесисто скриптуется на Python, до всех почти кнопок можно дотянуться командами – в сравнении с ним у разработчиков DaVinci Resolve есть над чем поработать. Но лиха беда начало!

Чтобы включить скрипты в DaVinci Resolve, нужно сначала завести пути и переменные среды. Для macOS в моём случае надо записать их в файл профиля ~/.bash_profile:

export PATH="$PATH:/Library/Application Support/Blackmagic 
Design/DaVinci Resolve/Developer/Scripting/Modules:$PATH"

export RESOLVE_SCRIPT_API="/Library/Application Support/Blackmagic 
Design/DaVinci Resolve/Developer/Scripting/"

export RESOLVE_SCRIPT_LIB="/Applications/DaVinci Resolve/DaVinci 
Resolve.app/Contents/Libraries/Fusion/fusionscript.so"

export PYTHONPATH="$PYTHONPATH:$RESOLVE_SCRIPT_API/Modules/"

Есть несколько возможностей запускать скрипты в DaVinci Resolve:

  • Запускать через маленькое окошко Console в редакторе. Это единственный вариант для бесплатной версии DaVinci Resolve. Краем глаза я видел, что народ уже написал некие обвязки, которые помогают этому варианту быть минимально удобным;
  • Запускать через внешнюю консоль ОС или внешний редактор. Способ удобен тем, что можно писать код в любимом редакторе, и проверять что получается в открытом DaVinci, а потом готовые скрипты запускать просто в консоли;
  • Можно положить скрипты в папку (на macos) /Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Scripts/Comp и вызывать их через меню Workplace → Scripts.

Для работы внешних скриптов в DaVinci Resolve нужно сделать импорт файла DaVinciResolveScript.py, который живёт на macos в папке /Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules. Внутри этого файла, в свою очередь, идёт импорт компонентов среды и библиотек DaVinci Resolve. Положение его в системе неважно, для удобства я просто скопировал его и положил рядом со своим скриптом, чтобы не морочиться с поиском его по системе.

Для написания внешнего скрипта нужна обвязка (Python я ставил в macos через Brew, поэтому такой путь):

#!/usr/local/Cellar/python/3.7.5/bin/python3
 
import DaVinciResolveScript as dvr
 
resolve = dvr.scriptapp("Resolve")
fusion = resolve.Fusion()
PM = resolve.GetProjectManager()
PM.CreateProject("Hello World")

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

proj = PM.GetCurrentProject() # проект
tl = proj.GetCurrentTimeline() # объект Timeline
mp = proj.GetMediaPool() # объект Media Pool 
ms = resolve.GetMediaStorage() # объект хранилища
folder = mp.GetRootFolder() # объект корневой папки

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

FPS = proj.GetSetting('timelineFrameRate') # получить текущую частоту кадров
N = 29.97 
proj.SetSetting('timelineFrameRate', N) # установить новую частоту

В DaVinci Resolve версии 16 появилось централизованное получение настроек GetSetting() и установка настроек SetSetting(). Если вызвать GetSetting() без параметров, то можно получить всё, что в принципе доступно:

print(proj.GetSetting())

Список там получается большой. Можно настроить проект по вкусу, собрать настройки командой выше, сохранить и далее сразу применять при старте проекта. Увы, аналогичную штуку с выбором параметров для рендеринга (Deliver) сделать у меня не получилось. Кодек и формат файла прочесть можно (причём “H264” показывает, а “H.265” – уже нет), а вот поменять – нет. Ещё из полезного – это автоимпорт клипов и чтение/запись метаданных клипа:

ms.AddItemsToMediaPool('~/Movies/_PROJECTS/test1.mov','~/Movies/_PROJECTS/test2.mov')
clips = folder.GetClips() # список клипов в корневой папке
CurrentClipName = clips[2.0].GetName() # возвращает имя второго клипа в списке
clip1Meta = clips[2.0].GetMetadata() # метаданные клипа

# создать timeline из клипов - в данном случае из одного второго
mp.CreateTimelineFromClips("NameOfTimeline", clips[2.0]) 

mp.AppendToTimeline(clips[2.0]) # добавить в конец timeline первый клип

Пока функционал скриптов в DaVinci Resolve оставляет желать лучшего, и даже вошедший в состав Fusion задаёт пример как надо, и ещё вот тут.

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

Leave a Reply

Your email address will not be published. Required fields are marked *