Как перевести секунды в кадры Timeline для Resolve API
FPS, базовый кадр Timeline и расчет recordFrame для AppendToTimeline
Показываем простой рабочий конвертер секунд в абсолютный кадр Timeline, который нужен при вставке аудио, титров и медиа по времени.
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 = safe_call(resolve, "GetProjectManager")
project = safe_call(project_manager, "GetCurrentProject") if project_manager else None
if not project:
raise RuntimeError("Нет открытого проекта DaVinci Resolve")
timeline = safe_call(project, "GetCurrentTimeline")
if not timeline:
raise RuntimeError("Нет активного Timeline")
return resolve, project, timeline
def get_timeline_fps(project, timeline, default: float = 24.0) -> float:
value = safe_call(timeline, "GetSetting", "timelineFrameRate")
if not value:
value = safe_call(project, "GetSetting", "timelineFrameRate")
try:
return float(value)
except Exception:
return float(default)
def get_timeline_base_frame(timeline) -> int:
value = safe_call(timeline, "GetStartFrame")
try:
return int(value)
except Exception:
return 0
def seconds_to_abs_frame(seconds: float, fps: float, base_frame: int = 0) -> int:
return int(round(base_frame + max(0.0, float(seconds)) * float(fps)))
resolve, project, timeline = get_project_and_timeline()
fps = get_timeline_fps(project, timeline)
base_frame = get_timeline_base_frame(timeline)
record_frame = seconds_to_abs_frame(12.5, fps, base_frame)
print("FPS:", fps, "recordFrame:", record_frame)
Документация
Что делает пример
Скрипт получает FPS Timeline, стартовый кадр и переводит секунды в абсолютный кадр, который можно передать в recordFrame.
Почему нужен base_frame
Timeline может начинаться не с нулевого кадра. Если игнорировать стартовый кадр, вставка может сместиться относительно фактического таймкода проекта.
Где используется
Этот расчет нужен для AppendToTimeline, SetCurrentFrame, построения диапазонов, экспорта сегментов и любых операций, где входные данные приходят в секундах.
Разбор примера
Подключение к Resolve
Пример начинает работу с подключения к запущенному DaVinci Resolve через официальный Python-модуль.
Проверка проекта
Перед вызовами Media Pool, Timeline или Render Queue код проверяет наличие открытого проекта.
Вызов метода API
Основной блок выполняет задачу статьи: как перевести секунды в кадры timeline для resolve api.
Проверка результата
После вызова API результат проверяется, чтобы скрипт не продолжал работу с пустым объектом или не созданной задачей.
Особенности Resolve API
- FPS берите из Timeline, а не задавайте жестко.
- seconds меньше 0 лучше ограничивать нулем.
- recordFrame должен быть целым числом.
- Для проектов с нестандартным стартовым таймкодом дополнительно проверяйте GetStartTimecode.
Частые ошибки
Resolve API недоступен
Причина: Приложение не запущено или Python не видит DaVinciResolveScript.
Решение: Запустите Resolve и проверьте путь к Developer/Scripting/Modules.
Метод вернул None или False
Причина: В Resolve нет нужного проекта, Timeline, клипов, preset или доступа к папке.
Решение: Проверьте входные данные и добавьте явную проверку результата после каждого важного вызова API.
Скрипт работает только на одной машине
Причина: Пути к файлам или папкам Resolve зашиты под конкретную систему.
Решение: Вынесите пути в переменные и добавьте стандартные пути Windows, Linux и macOS.
Следующий шаг
Следующий шаг зависит от задачи: импорт медиа, создание Timeline или запуск рендера.
Связанные статьи API
Timeline
Как получить FPS Timeline через DaVinci Resolve Python API
Рабочий пример читает FPS активного Timeline, корректно приводит строковое значение к float и использует настройки проекта как запасной источник.
Timeline
Как получить стартовый кадр Timeline в DaVinci Resolve API
Показываем, как получить стартовый кадр Timeline через GetStartFrame и аккуратно обработать версии Resolve, где доступен только другой вариант чтения позиции.
Audio
Как добавить аудиофайл на Timeline через Python API
Показываем рабочий шаблон вставки аудиофайла на конкретную аудиодорожку DaVinci Resolve через Media Pool и Timeline API.

