multicam: wizard + AFV + node-graph preview + performance
CI / Build & test (Linux) (push) Failing after 24s
CI / Build & test (Windows) (push) Failing after 3m38s

- wizard: angle multi-select, sync modes, auto-align, create sequence;
  keeps the host sequence current (host clip = the multicam clip)
- build_multicam_sequence: per-angle clip -> SOURCES_INPUT[element],
  array slot growth, audio angle tracks for AFV
- AFV: host linked audio clip follows the switched source (one undo),
  muted host audio track disables it
- node-graph preview: inline producer renders through the traverser
  (viewer/project-matched graph frames); sequence viewer uses the graph
- multicam node value(): element-tagged row keys (sources_in[i]),
  reads the current source; build_row keys array inputs by element
- angle grid: viewer=0 (single-track montage, not whole-graph)
- project explorer: rename (dialog) + delete (undoable) real items
- performance: decoded-frame LRU, per-process NVDEC quota (1 session,
  evict before open), GPU composite fail-once fallback, snapshot
  upload debounced on the engine tick, worker vram budget headroom
- timeline clip: multicam overlay via ClipDecorator
- wizard menu item moved to Sequence menu
This commit is contained in:
2026-09-01 20:27:59 +08:00
parent 8de9af705e
commit 1b0a15192e
25 changed files with 3528 additions and 65 deletions
+14
View File
@@ -145,6 +145,20 @@
"panel.timeline": "Zeitleiste"
"panel.effect_library": "Effektbibliothek"
"panel.multicam": "Multikamera"
"panel.multicam": "Multikamera"
"menu.sequence.multicam_wizard": "Multikamera-Assistent"
"multicam.wizard.title": "Multikamera-Assistent"
"multicam.wizard.default_name": "Multikamera"
"multicam.wizard.name": "Sequenzname"
"multicam.wizard.sync": "Synchronisierung"
"multicam.sync.audio": "Audiowellenform"
"multicam.sync.timecode": "Quellzeitcode"
"multicam.sync.none": "Keine (keine Ausrichtung)"
"multicam.wizard.angles_label": "Kameras (mindestens zwei auswählen):"
"multicam.wizard.no_footage": "Kein Material im Projekt für eine Multikamera."
"multicam.wizard.need_two": "Bitte mindestens zwei Kameras auswählen."
"multicam.wizard.create": "Erstellen"
"multicam.no_multicam": "Kein Multikamera-Clip erkannt"
"multicam.no_multicam": "Kein Multikamera-Clip erkannt"
"multicam.switch_1": "Zu Kamera 1 wechseln"
"multicam.switch_2": "Zu Kamera 2 wechseln"
+12
View File
@@ -145,6 +145,18 @@
"panel.timeline": "Timeline"
"panel.effect_library": "Effect Library"
"panel.multicam": "Multi-Cam"
"menu.sequence.multicam_wizard": "Multi-Cam Wizard"
"multicam.wizard.title": "Multi-Cam Wizard"
"multicam.wizard.default_name": "Multi-Cam"
"multicam.wizard.name": "Sequence Name"
"multicam.wizard.sync": "Sync Method"
"multicam.sync.audio": "Audio Waveform"
"multicam.sync.timecode": "Source Timecode"
"multicam.sync.none": "None (No Alignment)"
"multicam.wizard.angles_label": "Angles (select at least two):"
"multicam.wizard.no_footage": "No footage in the project to create a multicam from."
"multicam.wizard.need_two": "Select at least two angles."
"multicam.wizard.create": "Create"
"multicam.no_multicam": "No multi-camera clip detected"
"multicam.switch_1": "Switch to Camera 1"
"multicam.switch_2": "Switch to Camera 2"
+14
View File
@@ -145,6 +145,20 @@
"panel.timeline": "Línea de tiempo"
"panel.effect_library": "Biblioteca de efectos"
"panel.multicam": "Multicámara"
"panel.multicam": "Multicámara"
"menu.sequence.multicam_wizard": "Asistente multicámara"
"multicam.wizard.title": "Asistente multicámara"
"multicam.wizard.default_name": "Multicámara"
"multicam.wizard.name": "Nombre de la secuencia"
"multicam.wizard.sync": "Método de sincronización"
"multicam.sync.audio": "Forma de onda de audio"
"multicam.sync.timecode": "Código de tiempo de origen"
"multicam.sync.none": "Ninguna (sin alineación)"
"multicam.wizard.angles_label": "Cámaras (selecciona al menos dos):"
"multicam.wizard.no_footage": "No hay material en el proyecto para crear una multicámara."
"multicam.wizard.need_two": "Selecciona al menos dos cámaras."
"multicam.wizard.create": "Crear"
"multicam.no_multicam": "No se ha detectado ningún clip multicámara"
"multicam.no_multicam": "No se ha detectado ningún clip multicámara"
"multicam.switch_1": "Cambiar a cámara 1"
"multicam.switch_2": "Cambiar a cámara 2"
+14
View File
@@ -145,6 +145,20 @@
"panel.timeline": "Montage"
"panel.effect_library": "Bibliothèque d'effets"
"panel.multicam": "Multicam"
"panel.multicam": "Multicam"
"menu.sequence.multicam_wizard": "Assistant multicaméra"
"multicam.wizard.title": "Assistant multicaméra"
"multicam.wizard.default_name": "Multicaméra"
"multicam.wizard.name": "Nom de la séquence"
"multicam.wizard.sync": "Méthode de synchronisation"
"multicam.sync.audio": "Forme d’onde audio"
"multicam.sync.timecode": "Code temporel source"
"multicam.sync.none": "Aucune (pas d’alignement)"
"multicam.wizard.angles_label": "Caméras (sélectionnez au moins deux) :"
"multicam.wizard.no_footage": "Aucun média dans le projet pour créer une multicaméra."
"multicam.wizard.need_two": "Sélectionnez au moins deux caméras."
"multicam.wizard.create": "Créer"
"multicam.no_multicam": "Aucun clip multicaméra détecté"
"multicam.no_multicam": "Aucun clip multicaméra détecté"
"multicam.switch_1": "Passer à la caméra 1"
"multicam.switch_2": "Passer à la caméra 2"
+14
View File
@@ -145,6 +145,20 @@
"panel.timeline": "タイムライン"
"panel.effect_library": "エフェクトライブラリ"
"panel.multicam": "マルチカム"
"panel.multicam": "マルチカム"
"menu.sequence.multicam_wizard": "マルチカムウィザード"
"multicam.wizard.title": "マルチカムウィザード"
"multicam.wizard.default_name": "マルチカム"
"multicam.wizard.name": "シーケンス名"
"multicam.wizard.sync": "同期方法"
"multicam.sync.audio": "オーディオ波形"
"multicam.sync.timecode": "ソースタイムコード"
"multicam.sync.none": "なし(整列しない)"
"multicam.wizard.angles_label": "カメラ(2つ以上選択):"
"multicam.wizard.no_footage": "プロジェクトにマルチカムを作成できる素材がありません。"
"multicam.wizard.need_two": "少なくとも2つのカメラを選択してください。"
"multicam.wizard.create": "作成"
"multicam.no_multicam": "マルチカメラクリップが検出されませんでした"
"multicam.no_multicam": "マルチカメラクリップが検出されませんでした"
"multicam.switch_1": "カメラ1に切り替え"
"multicam.switch_2": "カメラ2に切り替え"
+14
View File
@@ -145,6 +145,20 @@
"panel.timeline": "Linha do tempo"
"panel.effect_library": "Biblioteca de efeitos"
"panel.multicam": "Multicâmera"
"panel.multicam": "Multicâmera"
"menu.sequence.multicam_wizard": "Assistente multicâmera"
"multicam.wizard.title": "Assistente multicâmera"
"multicam.wizard.default_name": "Multicâmera"
"multicam.wizard.name": "Nome da sequência"
"multicam.wizard.sync": "Método de sincronização"
"multicam.sync.audio": "Forma de onda de áudio"
"multicam.sync.timecode": "Código de tempo de origem"
"multicam.sync.none": "Nenhuma (sem alinhamento)"
"multicam.wizard.angles_label": "Câmeras (selecione pelo menos duas):"
"multicam.wizard.no_footage": "Nenhum material no projeto para criar uma multicâmera."
"multicam.wizard.need_two": "Selecione pelo menos duas câmeras."
"multicam.wizard.create": "Criar"
"multicam.no_multicam": "Nenhum clipe multicâmera detectado"
"multicam.no_multicam": "Nenhum clipe multicâmera detectado"
"multicam.switch_1": "Alternar para a câmera 1"
"multicam.switch_2": "Alternar para a câmera 2"
+14
View File
@@ -145,6 +145,20 @@
"panel.timeline": "Таймлайн"
"panel.effect_library": "Библиотека эффектов"
"panel.multicam": "Мультикамера"
"panel.multicam": "Мультикамера"
"menu.sequence.multicam_wizard": "Мастер мультикамеры"
"multicam.wizard.title": "Мастер мультикамеры"
"multicam.wizard.default_name": "Мультикамера"
"multicam.wizard.name": "Имя последовательности"
"multicam.wizard.sync": "Метод синхронизации"
"multicam.sync.audio": "Аудиосигнал (форма волны)"
"multicam.sync.timecode": "Исходный таймкод"
"multicam.sync.none": "Нет (без выравнивания)"
"multicam.wizard.angles_label": "Камеры (выберите не менее двух):"
"multicam.wizard.no_footage": "В проекте нет материала для создания мультикамеры."
"multicam.wizard.need_two": "Выберите не менее двух камер."
"multicam.wizard.create": "Создать"
"multicam.no_multicam": "Не обнаружен клип мультикамеры"
"multicam.no_multicam": "Не обнаружен клип мультикамеры"
"multicam.switch_1": "Переключиться на камеру 1"
"multicam.switch_2": "Переключиться на камеру 2"
+12
View File
@@ -145,6 +145,18 @@
"panel.timeline": "时间线"
"panel.effect_library": "效果库"
"panel.multicam": "多机位"
"menu.sequence.multicam_wizard": "多机位向导"
"multicam.wizard.title": "多机位向导"
"multicam.wizard.default_name": "多机位"
"multicam.wizard.name": "序列名称"
"multicam.wizard.sync": "同步方式"
"multicam.sync.audio": "音频波形"
"multicam.sync.timecode": "源时间码"
"multicam.sync.none": "无(不自动对齐)"
"multicam.wizard.angles_label": "机位(至少选择两个):"
"multicam.wizard.no_footage": "项目中没有可用于创建多机位的素材。"
"multicam.wizard.need_two": "请至少选择两个机位。"
"multicam.wizard.create": "创建"
"multicam.no_multicam": "未检测到多机位片段"
"multicam.switch_1": "切换到机位 1"
"multicam.switch_2": "切换到机位 2"