Tutorial de pantalla en una línea de tiempo de Resolve
Convierte una descripción de un tutorial (film.json) y sus capturas de pantalla en una línea de tiempo que un editor puede seguir trabajando. Los clips tienen fotogramas clave comunes del Inspector, los títulos son títulos Fusion con controles en el Inspector y las escenas están marcadas. No añade audio, por lo que la narración y la música se agregan después.
La API de Resolve no puede establecer fotogramas clave ni la duración de un título, por lo que la compilación los escribe en un archivo de línea de tiempo y lo importa. references/how-it-works.md explica esto y enumera problemas conocidos. Léalo si un paso falla o Resolve es más reciente que 21.2.
Antes de empezar
- Resolve Studio está en ejecución con un proyecto abierto. Verifíquelo con
get_resolve_statusy llame aget_whats_newuna vez consinceestablecido en21.0, ya que el servidor de Resolve lo solicita. - Fuera de Resolve: Python con
pillowy ffmpeg en PATH. - El formato de línea de tiempo del proyecto debe ser 1920x1080.
preflightlo verifica.
Decida con el usuario
Resuelva estos puntos a partir de la conversación si es posible, y pregunte solo sobre lo que falta:
- El proyecto. La línea de tiempo va al proyecto abierto. Nómbrelo como el usuario. Cambiar de proyecto podría perder su trabajo no guardado, así que pídale que cambie si es el incorrecto.
- Las capturas de pantalla. Vienen del usuario, o usted las captura. Con Playwright, use un viewport de 1920x1080 con
deviceScaleFactor: 2: las imágenes salen a 3840x2160, ygetBoundingClientRectda posiciones que ya son correctas parafilm.json. Revise cada imagen suministrada, use las que se ajusten a la audiencia e informe al usuario qué omitió. - La marca. Colores, fuente, logotipo y cualquier etiqueta como Anfitrión o Admin. Busque primero en el código del usuario o en títulos anteriores. Text+ solo ve fuentes instaladas, y no instale una sin preguntar.
- El nombre de la línea de tiempo. Elija uno que esté libre. Nunca reemplace una línea de tiempo que usted no haya creado.
Escriba la película
Cree una carpeta para la película y escriba film.json en ella. references/film-format.md tiene el formato. Léalo ahora.
Algunos tiempos que se ven bien:
- Muestre una escena durante 6 a 10 s, y mantenga un título el tiempo suficiente para leerlo dos veces, aproximadamente 1 s por cada 8 caracteres.
- Mueva la cámara durante aproximadamente 1 s, y déjela estabilizar antes de que el cursor se mueva o aparezca el resalte.
- Mueva el cursor durante aproximadamente 0.8 s, y haga clic aproximadamente 0.3 s después de que aterrice.
- Muestre el resultado de un clic con una nueva toma justo después, si la disposición de la nueva toma se alinea con el zoom actual. Si la página cambia por completo, termine la escena justo después del clic y deje que la disolución la lleve a la siguiente.
- Para mantener el cursor quieto durante una disolución, inicie el cursor de la siguiente escena en el mismo lugar del fotograma, usando
x' = tx + x * zoom. - Use una tarjeta de aproximadamente 3 s en cada extremo.
Los títulos deben decir solo lo que muestran las capturas de pantalla o lo que el usuario le dijo, y cualquier inferencia va en su informe.
Un resalte que no da en su botón es el error más visible que este formato puede producir, así que mida en lugar de estimar. Las imágenes pueden mostrarse a una escala diferente a su tamaño real, así que no lea las posiciones directamente de ellas:
python "<SKILL>/scripts/measure.py" grid shot.png grid.png
Abra grid.png, que tiene coordenadas del fotograma marcadas, para encontrar un punto aproximado en el relleno del botón. Luego obtenga su rectángulo exacto y verifique el resultado:
python "<SKILL>/scripts/measure.py" at shot.png 1250 470
python "<SKILL>/scripts/measure.py" show shot.png check.png 1200,450,180,40
Un botón cuyo borde coincide con un color cercano puede filtrarse, así que lea las advertencias y reduzca la tolerancia si el rectángulo parece demasiado grande.
Compilación
SKILL es la carpeta de esta habilidad y WORK es la carpeta de la película. Los pasos de shell se ejecutan desde cualquier lugar. Los pasos de Resolve se realizan a través de run_script_unsafe. Pase timeout: 60 en cada llamada, porque el valor predeterminado de la herramienta es 10 s y los pasos pueden tardar más. Cada uno comienza con:
SKILL = r'<carpeta de esta habilidad>'; WORK = r'<carpeta de la película>'
exec(open(SKILL + r'\scripts\resolve_steps.py', encoding='utf8').read())
Antes de que exista film.json, project_format(project) da el tamaño del proyecto, la velocidad de fotogramas y las líneas de tiempo, y fonts_available('Lato', ...) las fuentes instaladas y sus estilos. Establezca fps a la velocidad del proyecto a menos que haya una razón para no hacerlo.
1. Verifique el proyecto. Corrija cualquier cosa en problems antes de continuar, preguntando al usuario cuando sea su decisión, y transmita cualquier notes. No cambia nada.
result = preflight(project, WORK)
2. Planifique e instale los títulos. Lea las advertencias y corrija lo que importa en film.json. Esto coloca los títulos en la carpeta Plantillas de Resolve para la marca, reemplazando cualquier título con los mismos nombres, así que informe al usuario.
python "<SKILL>/scripts/plan.py" "<WORK>"
python "<SKILL>/scripts/templates.py" "<WORK>" --install
3. Construya la línea de tiempo. Esto exporta los bloques de construcción, escribe el archivo de línea de tiempo, lo importa, aplica las configuraciones que la API puede establecer, verifica el resultado y elimina las dos líneas de tiempo temporales de esta compilación. Solo reemplaza una línea de tiempo que esta carpeta haya creado, y las ediciones realizadas en ella se pierden, así que pregunte primero si el usuario podría haberla editado.
result = build_film(project, WORK)
verify.problems debe estar vacío. Si done es falso, repita result = finish_batch(project, WORK) hasta que sea verdadero, luego ejecute result = dict(verify=verify(project, WORK), cleanup=cleanup(project, WORK)). Resolve puede tardar unos segundos en ver los títulos recién instalados, así que build_film espera por ellos. Si aún no puede insertarlos, pida al usuario que reinicie Resolve después de guardar su trabajo.
No elimine bins, aquí ni al ordenar: los clips pueden estar vinculados de un bin a líneas de tiempo en otro lugar (consulte references/how-it-works.md).
4. Revíselo. Esto exporta hojas etiquetadas de fotogramas directamente desde la línea de tiempo: cada escena, la mitad de cada resalte y justo después de cada clic. Tarda unos segundos y no necesita renderizado, por lo que la configuración de renderizado no cambia. Abra las hojas en build/review/.
result = review_frames(project, WORK)
Verifique que los resaltes estén sobre sus elementos, el cursor aterrice donde debe, las ondas sean visibles, los títulos encajen y nada sea negro. Para una inspección más detallada, review_frames(project, WORK, seconds=[10.5, 20.2]) da esos momentos a tamaño completo, en segundos de línea de tiempo. plan.py imprime cuándo comienza cada escena, para convertir desde tiempos de escena.
Los fotogramas coinciden con un renderizado del mismo fotograma, probado en Resolve 21.2. review_frames necesita la API de exportación de fotogramas que tiene 21.2. En una versión anterior de Resolve genera un error, y el renderizado a continuación hace el trabajo: ejecute review.py sin una referencia para obtener las mismas hojas.
5. Renderice, cuando necesite un archivo. Renderice para entregar un video al usuario, o para la comparación de remotion-to-resolve. start_render cambia la configuración de renderizado del proyecto, así que dígalo.
result = start_render(project, WORK, 'review')
result = wait_render(project, '<job id>', 50) # repita hasta que el estado sea Complete
python "<SKILL>/scripts/review.py" "<WORK>" "<WORK>/build/render/review.mp4"
Elimine su trabajo, y solo el suyo, ya que la cola puede contener trabajos del usuario:
result = remove_job(project, '<job id>')
Para cambiar algo, edite film.json, ejecute plan.py y llame a build_film de nuevo, luego revise de nuevo. Si renderizó, elimine primero el trabajo. Ejecute también templates.py de nuevo si la marca o fps cambiaron. Si el usuario ha editado la línea de tiempo manualmente, pregunte antes de reconstruir, o haga el cambio manualmente en la línea de tiempo.
Finalización
Deje el guardado al usuario a menos que él lo pida, porque guardar también confirma cualquier otra edición no guardada que tenga abierta. Informe:
- la línea de tiempo y el bin, y las pistas
- dónde se instalaron los títulos
- que la nueva línea de tiempo es ahora la actual, nombrando la que
preflightencontró abierta, y, si renderizó, que la configuración de renderizado cambió - cualquier redacción de título que haya inferido, y cualquier cosa en las capturas que entre en conflicto con el resumen
- qué verificó y qué no. Los fotogramas muestran la imagen, pero no el movimiento ni cómo se ven el Inspector y la línea de tiempo en Resolve.
- cualquier aproximación, y estos límites: sin audio, solo imágenes fijas, y resaltes que permanecen en el fotograma durante los movimientos de cámara
Los clips provienen de sus archivos en disco, por lo que mover la carpeta de la película o las capturas desconecta los clips. Mantenga también build/assets/, ya que el cursor y los fondos viven allí.
Para eliminar los títulos de una marca de la Biblioteca de Efectos, ejecute templates.py "<WORK>" --uninstall. Solo elimina esos cuatro archivos de la marca. Las líneas de tiempo ya construidas mantienen sus propias copias: un renderizado después de eliminarlos salió idéntico.