Как обрезать 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 и показаны в рабочем примере.
Возвращает
Возвращаемое значение нужно проверять перед следующим шагом автоматизации.
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 обычно приходят из предварительно рассчитанного списка операций. Здесь они заданы вручную, чтобы пример оставался понятным и проверяемым.
Разбор примера
Подключение к Resolve
Пример начинает работу с подключения к запущенному DaVinci Resolve через официальный Python-модуль.
Проверка проекта
Перед вызовами Media Pool, Timeline или Render Queue код проверяет наличие открытого проекта.
Вызов метода API
Основной блок выполняет задачу статьи: как обрезать timelineitem через davinci resolve python api.
Проверка результата
После вызова 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
Timeline
Как удалить клипы с Timeline через DaVinci Resolve Python API
Показываем техническую часть удаления клипов: как найти элементы на активном Timeline и передать нужные TimelineItem в DeleteClips.
Timeline
Как собрать карту клипов Timeline через DaVinci Resolve API
Создаем техническую карту Timeline: дорожка, тип медиа, имя клипа, старт, конец, длительность и путь к исходному файлу через MediaPoolItem.
Timeline
Как разрезать клип в DaVinci Resolve через Python
Показываем практический способ разрезания клипа: найти элементы Timeline, которые пересекают нужный кадр, поставить playhead и выполнить штатный split в интерфейсе Resolve.

