← Все статьи DaVinci Resolve API
DaVinci Resolve APIСреднийRender

Как запустить рендер в DaVinci Resolve через Python API

Render Preset, SetRenderSettings, AddRenderJob и StartRendering

Показываем рабочий запуск Render Queue из Python: выбор доступного preset, настройка папки и имени файла, создание render job, запуск свежей задачи и ожидание завершения.

API

Resolve Scripting API

Язык

Python

Resolve

19–20+

Требуется

Запущенный Resolve

Синтаксис

result = api_method()

Параметры

  • Параметры зависят от конкретного метода Resolve Scripting API и показаны в рабочем примере.

Возвращает

Возвращаемое значение нужно проверять перед следующим шагом автоматизации.

Полный рабочий пример Pythonкод можно использовать как основу скрипта
import os
import sys
from pathlib import Path


def import_resolve_module():
    try:
        import DaVinciResolveScript as dvr
        return dvr
    except ImportError:
        search_paths = [
            os.environ.get("RESOLVE_SCRIPT_API", ""),
            os.environ.get("RESOLVE_MODULES", ""),
            r"C:\\ProgramData\\Blackmagic Design\\DaVinci Resolve\\Support\\Developer\\Scripting\\Modules",
            "/opt/resolve/Developer/Scripting/Modules",
            "/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules",
            str(Path.home() / "Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting/Modules"),
        ]
        for path in search_paths:
            if path and os.path.isdir(path) and path not in sys.path:
                sys.path.append(path)
        import DaVinciResolveScript as dvr
        return dvr


dvr = import_resolve_module()

import time

output_dir = r"D:\\Resolve\\renders"
render_name = "api_render_demo"
render_preset = "YouTube 1080p"

if not os.path.isdir(output_dir):
    os.makedirs(output_dir, exist_ok=True)

resolve = dvr.scriptapp("Resolve")
if not resolve:
    raise RuntimeError("Resolve API недоступен")

project = resolve.GetProjectManager().GetCurrentProject()
if not project:
    raise RuntimeError("Нет открытого проекта")

if not project.GetCurrentTimeline():
    raise RuntimeError("Нет активного Timeline")

presets = project.GetRenderPresetList() or []
if render_preset in presets:
    project.LoadRenderPreset(render_preset)
elif presets:
    project.LoadRenderPreset(presets[0])

project.SetRenderRange("Entire Timeline")

settings = {
    "TargetDir": output_dir,
    "CustomName": render_name,
    "RenderMode": "SingleClip",
    "ExportVideo": True,
    "ExportAudio": True,
}

project.SetRenderSettings(settings)
job_id = project.AddRenderJob()
if not job_id:
    raise RuntimeError("Не удалось создать Render Job")

started = project.StartRendering([job_id]) or project.StartRendering(job_id)
if not started:
    started = project.StartRendering()

if not started:
    raise RuntimeError("Resolve отказался запускать рендер")

while project.IsRenderingInProgress():
    time.sleep(1)

print("Render finished:", job_id)

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

Как устроен запуск рендера

Скрипт работает с текущим проектом и активным Timeline. Он загружает Render Preset, задаёт диапазон Entire Timeline, передаёт базовые настройки вывода, создаёт Render Job и запускает очередь. Такой сценарий соответствует обычной работе Deliver page, только выполняется из Python.

Почему удобен Render Preset

Полные параметры кодека, контейнера, битрейта и разрешения лучше сохранить в Resolve как preset. Тогда в коде остаются только понятные переменные: папка вывода, имя файла, диапазон и режим рендера. Это меньше ломается между версиями Resolve.

Почему StartRendering вызывается несколькими способами

В разных версиях Resolve встречается разное поведение StartRendering: одни принимают список job id, другие один job id, третьи запускают очередь без аргументов. Пример сначала пытается запустить свежий job адресно и только затем использует общий запуск очереди.

Ожидание результата

Цикл IsRenderingInProgress() нужен, если после экспорта скрипт должен выполнить следующий шаг: проверить файл, скопировать результат, открыть папку или передать ролик в другую систему. Без ожидания Python завершится раньше, чем Resolve закончит рендер.

Разбор примера

1

Подключение к Resolve

Пример начинает работу с подключения к запущенному DaVinci Resolve через официальный Python-модуль.

2

Проверка проекта

Перед вызовами Media Pool, Timeline или Render Queue код проверяет наличие открытого проекта.

3

Вызов метода API

Основной блок выполняет задачу статьи: как запустить рендер в davinci resolve через python api.

4

Проверка результата

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

Особенности Resolve API

  • Render Preset с указанным именем должен существовать в Resolve.
  • TargetDir должен быть доступен для записи.
  • Перед рендером нужен активный Timeline.
  • Если StartRendering вернул False, проверьте Deliver page, preset, путь вывода и очередь рендера.

Частые ошибки

Resolve API недоступен

Причина: Приложение не запущено или Python не видит DaVinciResolveScript.

Решение: Запустите Resolve и проверьте путь к Developer/Scripting/Modules.

Метод вернул None или False

Причина: В Resolve нет нужного проекта, Timeline, клипов, preset или доступа к папке.

Решение: Проверьте входные данные и добавьте явную проверку результата после каждого важного вызова API.

Скрипт работает только на одной машине

Причина: Пути к файлам или папкам Resolve зашиты под конкретную систему.

Решение: Вынесите пути в переменные и добавьте стандартные пути Windows, Linux и macOS.

Следующий шаг

Следующий шаг зависит от задачи: импорт медиа, создание Timeline или запуск рендера.

Связанные статьи API