0:05    myText1 is textClass
0:06    myText1 text "Bienvenidos a la proyección."
0:07    myText1 position sph 0 -30 10
0:08    myText1 color 100 100 100 # Blanco
0:09    myText1 intensity 100
0:10    scene add myText1 near  # Añadir texto a la escena
0:11    myText1 intensity 0 dur 1 # Desvanecer el texto seg. 10
0:12    myText1 delete

Digistar no tiene soporte nativo para archivos VTT. Pero puedes usar Python para transformar el archivo .vtt en comandos Digistar (subtitles.ds).

Ejemplo de un archivo VTT

WEBVTT

00:00:05.000 --> 00:00:10.000
Bienvenidos a la proyección.

00:00:15.000 --> 00:00:20.000
Aquí vemos una nebulosa.

00:00:25.000 --> 00:00:30.000
Las estrellas nacen en estos lugares.

Digistar necesita un mínimo de tiempo para renderizar el texto y aplicar las transiciones. El archivo .vtt debe tener marcas de tiempo de al menos 3 segundos para asegurar que el subtítulo sea visible y tenga una transición adecuada.

Cómo usarlo en tu script de video

En video.ds, simplemente agrega:

script play $Content/Scripts/subtitles.ds

vtt_to_ds.py

import os
import re

def vtt_to_ds(vtt_file, output_file, min_duration=3, buffer_time=0.5):
    with open(vtt_file, "r", encoding="utf-8") as f:
        lines = f.readlines()

    subtitle_blocks = []
    current_block = []

    for line in lines:
        line = line.strip()
        if "-->" in line:
            start_time, end_time = line.split(" --> ")
            start_seconds = convert_to_seconds(start_time)
            end_seconds = convert_to_seconds(end_time)
            duration = end_seconds - start_seconds

            if duration < min_duration:
                end_seconds = start_seconds + min_duration  # Ajustar duración mínima

            current_block = [start_seconds, end_seconds + buffer_time, ""]  # Añadir margen
        elif line and not line.startswith("WEBVTT"):
            current_block[2] = line
            subtitle_blocks.append(current_block)

    with open(output_file, "w", encoding="utf-8") as f:
        for i, (start, end, text) in enumerate(subtitle_blocks):
            f.write(f"{start}    myText{i+1} is textClass\n")
            f.write(f"{start+1}    myText{i+1} text \"{text}\"\n")
            f.write(f"{start+2}    myText{i+1} position sph 0 -30 10\n")
            f.write(f"{start+3}    myText{i+1} color 100 100 100\n")
            f.write(f"{start+4}    myText{i+1} intensity 100\n")
            f.write(f"{start+5}    scene add myText{i+1} near\n")
            f.write(f"{end}    myText{i+1} intensity 0 dur 1\n")
            f.write(f"{end+1}    myText{i+1} delete\n\n")

def convert_to_seconds(time_str):
    h, m, s = map(float, re.split("[:.]", time_str.replace(",", ".")))
    return int(h * 3600 + m * 60 + s)

def process_all_vtt_files(root_dir="."):
    for dirpath, _, filenames in os.walk(root_dir):
        for filename in filenames:
            if filename.endswith(".vtt"):
                vtt_path = os.path.join(dirpath, filename)
                ds_filename = f"subtitles_{os.path.splitext(filename)[0]}.ds"
                ds_path = os.path.join(dirpath, ds_filename)

                print(f"Procesando: {vtt_path} → {ds_path}")
                vtt_to_ds(vtt_path, ds_path)

# Ejecutar búsqueda en el directorio actual y subdirectorios
process_all_vtt_files()