← Все статьи DaVinci Resolve API
DaVinci Resolve APIПродвинутыйTimeline

Как обрезать TimelineItem через DaVinci Resolve Python API

SetStart, SetEnd, SetLeftOffset и SetRightOffset для технического trim клипа

Показываем безопасный пример trim: найти первый видеоклип, получить его границы и попробовать укоротить элемент через доступные методы TimelineItem.

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",
            "/opt/BlackmagicDesign/DaVinciResolve/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


def safe_call(obj, name, *args, **kwargs):
    try:
        fn = getattr(obj, name, None)
        if callable(fn):
            return fn(*args, **kwargs)
    except Exception:
        return None
    return None


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

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

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

    return resolve, project, timeline


def trim_item(item, new_start: int | None = None, new_end: int | None = None) -> bool:
    changed = False

    if new_start is not None:
        if safe_call(item, "SetStart", int(new_start)):
            changed = True
        else:
            current_start = int(safe_call(item, "GetStart") or 0)
            offset = max(0, int(new_start) - current_start)
            if offset and safe_call(item, "SetLeftOffset", offset):
                changed = True

    if new_end is not None:
        if safe_call(item, "SetEnd", int(new_end)):
            changed = True
        else:
            current_end = int(safe_call(item, "GetEnd") or 0)
            offset = max(0, current_end - int(new_end))
            if offset and safe_call(item, "SetRightOffset", offset):
                changed = True

    return changed


def first_video_item(timeline):
    track_count = int(safe_call(timeline, "GetTrackCount", "video") or 0)
    for track_index in range(1, track_count + 1):
        items = safe_call(timeline, "GetItemListInTrack", "video", track_index) or []
        if items:
            return items[0]
    return None


resolve, project, timeline = get_project_and_timeline()
item = first_video_item(timeline)
if not item:
    raise RuntimeError("На видеодорожках нет клипов")

start = int(safe_call(item, "GetStart") or 0)
end = int(safe_call(item, "GetEnd") or 0)

# Пример: укоротить первый видеоклип на 12 кадров с каждой стороны.
ok = trim_item(item, new_start=start + 12, new_end=end - 12)
print("Trim applied:", ok)

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

Что делает пример

Скрипт берет первый видеоклип на Timeline, читает его старт и конец, а затем пытается сдвинуть границы на 12 кадров. Сначала используются SetStart и SetEnd, затем более мягкий вариант через offsets.

Почему нужны оба варианта

В разных версиях Resolve API методы изменения границ TimelineItem могут вести себя по-разному. Bridge-подход делает вызовы осторожно и проверяет результат каждого метода.

Как применять на практике

В реальной задаче new_start и new_end обычно приходят из предварительно рассчитанного списка операций. Здесь они заданы вручную, чтобы пример оставался понятным и проверяемым.

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

1

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

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

2

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

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

3

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

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

4

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

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

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

  • Trim меняет Timeline, тестируйте пример на копии проекта.
  • Некоторые типы элементов могут не поддерживать SetStart или offsets.
  • Не задавайте new_end меньше new_start.
  • Проверяйте результат функции перед следующими операциями.

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

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

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

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

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

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

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

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

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

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

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

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

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