En mi
publicación anterior
, hablé sobre cómo extrajimos el contenido de los archivos FMV de origen y creamos herramientas para analizar aproximadamente 67 GB de archivos en busca de componentes intermedios utilizados para crear FMV. Estas partes son la base para crear contenido FMV remasterizado y se usaron como "dibujos de ensamblaje" para comenzar el proyecto.
Como se indicó en el artículo anterior, el flujo de trabajo de remasterización se divide en tres ramas: remasterización de cuadros dibujados a mano, remasterización de modelos 3D y remasterización de sonido. A continuación, hablaré sobre las características del flujo de trabajo y los trucos que utilizamos para automatizar la creación de la parte principal del video.
Aumentamos el tamaño de todos los cuadros dibujados a mano originales para que coincida con la resolución de 4K (3840x2160). Teniendo en cuenta la adición del ancho de la escena renovada y el hecho de que el juego se mostraba en píxeles no cuadrados, esto significaba que todos los recursos remasterizados tenían que crearse en una resolución de 4440x2400 píxeles.
Decidimos usar Adobe Animate para remasterizar todos los cuadros FMV dibujados a mano, porque ya teníamos un flujo de trabajo listo después de desarrollar Day of the Tentacle Remastered. El equipo de artistas dominó bien este proceso, por lo que no consideramos otras opciones.
Ejemplo de remasterización de un marco dibujado a manoLos modelos 3D originales de los archivos estaban en 3D Studio Release 3. Afortunadamente, las versiones modernas de 3D Studio Max pudieron importar todos los datos de las mallas y los fotogramas clave cinemáticos utilizando otro script de automatización. Después de eso, convertimos este archivo intermedio para trabajar en Autodesk Maya, donde los artistas hacen su magia de remasterización.
Para dar un nuevo estilo a las superficies de las mallas, se aplicaron nuevos sombreadores, se aplicaron texturas de alta calidad, y estas mallas se complementaron significativamente para darle al modelo un aspecto más suave. Además, la ventana de marco se expandió para que todas las cámaras de entrada de video correspondieran a la resolución de trabajo de 4440x2400 píxeles, porque la cámara original fue diseñada para una relación de aspecto más estrecha.
Ejemplo de remasterización de modelos 3DEn cuanto al audio, logramos encontrar la mayoría de las versiones originales de alta calidad, pero hubo excepciones. Las grabaciones del estudio de doblaje en inglés se archivaron en archivos, pero el doblaje en otros idiomas, que fueron contratados por socios externos, no estaba disponible para nosotros. Además, logramos encontrar la música original de The Gone Jackals, que se utilizó en FMV. Algunas versiones de efectos de sonido (SFX) se han reemplazado por un sonido más "ajustado" con un tipo de sonido similar.
A continuación se muestra un diagrama de flujo que explica aproximadamente cómo procesamos los recursos fuente y los vinculamos al contenido remasterizado. Los fotogramas de video originales extraídos (usando SanExtract.exe) se usaron como una "fuente" para la comparación con todos los archivos de datos de archivo. Los archivos de manifiesto de archivo se generan mediante una búsqueda recursiva de todos los datos de archivo; se utilizaron para encontrar rápidamente todos los archivos únicos de cierto tipo.
La herramienta SanWrangler se utilizó para comparar visualmente la "fuente" original de marcos y datos archivados. El usuario puede adjuntar visualmente archivos de almacenamiento a los marcos originales y guardarlos como un mapa de dependencia en formato XML. Después de crear el mapa de dependencia, fue suficiente usar un script de Python para generar automáticamente cuadros dibujados manualmente a partir de los recursos originales del archivo de "dibujo", así como también "dibujos de ensamblaje" para Maya 3D. Estos archivos se convirtieron en el punto de partida para el equipo de artistas, que luego procedió a la remasterización.
Extraer recursos originales y crear "dibujos de ensamblaje"Este fue el primero de muchos pasos que dieron como resultado que obtuviéramos versiones remasterizadas FMV listas para usar. Sí, por supuesto, ahora tenemos el punto de partida de todos los archivos que deben rehacerse, pero ¿cómo conectar todos estos fragmentos?
A continuación hablaré sobre los métodos de automatización utilizados en el flujo de trabajo de fabricación de FMV. Estos métodos se pueden usar no solo para generar FMV y aplicar no solo a un juego; Creo que son bastante universales, y se pueden usar en muchos aspectos del desarrollo del juego.
Como la mayoría de los flujos de trabajo de creación de gráficos, este proceso será iterativo. En algún lugar del archivo fuente puede haber un error que el artista debe corregir, y a veces fue necesario reexportar archivos dependientes de recursos. Creo que todos preferiríamos que este trabajo lo realice una computadora, en lugar de una persona propensa a errores.
Sabíamos exactamente cómo debería verse y sonar el video de Full Throttle Remastered, por lo que solo necesitábamos mejorar sus gráficos y sonido. Todos los videos tenían que coincidir con los originales, cuadro por cuadro, incluidas las rutas de la cámara, el volumen del sonido, la panorámica, etc. Para lograr esto, necesitábamos saber cómo era el flujo de trabajo de la creación de FMV originales. Y estos 67 GB de datos de los archivos de LucasArts contenían muchas pistas sobre cómo funcionaba todo en el original. Fueron un gran comienzo para nosotros.
El proceso de crear FMV original
Puede sonar un poco nostálgico, pero creo que es importante discutir los aspectos de "arqueología digital" de esta remasterización de juegos. Al final, comprender el proceso de creación del original le permitirá responder muchas preguntas y dar pistas sobre cómo los recursos se convirtieron en un resultado final. Y al crear nuevos FMV rehechos, necesitamos aplicar las mismas transformaciones a nuestros recursos remasterizados originales para que el producto terminado se vea lo más cerca posible del original. Incluyendo que necesitábamos lo siguiente:
- Ubicación de las pistas de audio en la línea de tiempo.
- Ajustes de volumen y panorama para pistas de audio cuando se juega en el juego
- Composición del marco y colocación de cada cuadro de video en el producto terminado
Una herramienta llamada SMUSHFT (SMUSH for Full Throttle) permitió al creador de FMV colocar recursos de video y audio en la línea de tiempo, y luego codificar la película FMV resultante (en formato .san), que fue leída por el motor del juego. Todos los videos se dividieron en una serie de cuadros que se pegaron para crear el resultado final. SMUSHFT permitió al usuario mover visualmente estos recursos a lo largo de la línea de tiempo y, si es necesario, rehacer el video.
No puedes mencionar que no participé en la creación del juego original. Solo podía adivinar cómo se crearon los recursos originales, estudiando datos archivados y mirando formatos y archivos ejecutables empaquetados en estos datos. Parece que los modelos 3D se crearon en Autodesk 3D Studio Release 3, y las partes dibujadas a mano se crearon en DeluxePaint Animation v1.0. Tampoco sé en qué etapas consistió la generación de datos de forma de onda para audio, pero cada clip de audio utilizado (en formato .sad) contiene información sobre el volumen y la panorámica por fotogramas clave, utilizados para mezclar sonido durante el juego.
El proceso de crear FMV originalDespués de crear estas partes separadas del marco, se realizó el proceso de combinar el marco. Este proceso combina representaciones de cuadros en 3D con cuadros de animación dibujados a mano (junto con todo lo demás), creando un producto terminado utilizado por la herramienta SMUSHFT (archivos .nut). Una vez que el proyecto estuvo listo para la codificación, el video se procesó y el resultado final (.san) ya se pudo reproducir en el motor del juego.
SMUSHFT realizó la codificación final del formato de archivo del video original (.san), y cada archivo de video tenía un archivo de proyecto (.pro) que describe el ensamblaje del video (sonido, video, ubicación de los subtítulos). Queríamos extraer esta información para poder generar el archivo de proyecto Adobe Premiere Pro y usarlo para codificar la versión convertida del video en resolución 4K. Para hacer esto, necesitábamos aplicar ingeniería inversa al archivo de proyecto SMUSHFT.
Ingeniería inversa de formatos de archivo
Es genial tener código fuente, porque puedes estudiarlo y entender cómo se creó / leyó el archivo del proyecto. Sin el código fuente, debe abrir el archivo del proyecto en un editor hexadecimal y analizar los patrones dentro del archivo. Esta es exactamente la forma en que solíamos extraer contenido útil del archivo de proyecto SMUSHFT.
Como pudimos ejecutar el SMUSHFT original en DOSBox, vimos la interfaz de usuario del programa, que nos dio pistas sobre el formato del archivo. Eche un vistazo a esta captura de pantalla para abrir el archivo .pro original:
Proyecto SMUSHFT de muestraAquí puede observar lo siguiente: hay recursos con nombre en el archivo (2027.NUT, 2027.SAD, IN_06A.NUT, etc.). Es probable que dichos recursos con nombre muestren caracteres ASCII dentro del archivo. Además, hay contadores de cuadros en la parte superior de la línea de tiempo y, a la izquierda de la línea de tiempo, hay un número creciente de capas. Y el último: cada recurso en la línea de tiempo se encuentra en un número de cuadro específico y tiene una cierta duración. Si podemos extraer esta información de los archivos originales del proyecto, nos informará dónde colocar automáticamente nuevos recursos en la línea de tiempo de Adobe Premiere Pro.
Proyecto de muestra de Adobe Premiere ProAl abrir el archivo original del proyecto en un editor hexadecimal, puede obtener información bastante útil. Mire el ejemplo anterior en hexadecimal:
Archivo de proyecto SMUSHFT en editor hexadecimalPodemos comenzar a mirar el archivo .pro con un editor hexadecimal (prefiero Hexplorer) e intentar buscar patrones. Puede encontrar fácilmente recursos con nombre en formato ASCII con un byte cero al final. Aproximadamente en la misma área de memoria hay un grupo de valores almacenados como cortos (entero de doble byte). Comparar números mostrados en SMUSHFT con
Los números del archivo del proyecto en formato hexadecimal nos dan la base para convertir correctamente el archivo del proyecto original en un editor de video moderno como Adobe Premiere Pro.
Kit de herramientas de automatización
La mayor parte de este flujo de trabajo fue automatizado y no requirió intervención humana. Una de las razones de esto fue que el contenido de todos los videos se copió completamente del original; de hecho, solo estábamos actualizando el contenido. Y, por lo tanto, prácticamente no tuvimos la oportunidad de cambiar completamente el formato FMV. Solo necesitábamos encontrar una manera de recrear el video utilizando recursos de alta resolución, mientras minimizamos el tiempo dedicado al producto.
Primero, debo decir que un paso inicial serio antes de automatizar todo el proceso debería ser una conversación con un equipo de creadores de contenido (gráficos y audio). La razón es que la mayoría de los procesos de automatización requieren que los creadores se adhieran a un cierto conjunto de reglas sobre la preparación de proyectos, ubicaciones de archivos, herramientas utilizadas, etc. En nuestro proyecto, esto significaba que teníamos que discutir herramientas para crear el contenido de cuadros dibujados a mano, modelos 3D y sonidos, y luego un editor de video para reunir todo esto. También fue necesario acordar qué partes del flujo de trabajo se realizarán manualmente y cuáles se automatizarán.
Como resultado, decidimos lo siguiente:
- Los marcos dibujados manualmente se crearán en Adobe Animate con una resolución de 4440x2400 píxeles.
- Los modelos 3D y las animaciones se crearán en Autodesk Maya y se renderizarán manualmente, también con una resolución de 4440x2400 píxeles
- Los archivos de audio se crearán en formato .wav con parámetros de 48 kHz y 16 bits
- Inicialmente, los fragmentos del video se generarán automáticamente y el artista podrá cambiar cualquier parte que necesite (con algunas excepciones)
- Las etapas finales de costura y codificación FMV serán automatizadas
Para que las herramientas sean lo más automatizadas posible, utilizamos varios métodos. Python fue elegido como el "pegamento" que conecta todo, porque está bien expandido por varias bibliotecas y el código es fácil de escribir y mantener. También aprovechamos su soporte interno para manipulaciones de archivos independientes de la plataforma (copiar, mover, eliminar).
Python - llamando a archivos ejecutables, obteniendo resultados
La biblioteca de subprocesos de Python fue ideal para nosotros, ya que le permite cambiar la ejecución de otros archivos ejecutables e incluso esperar la finalización de sus tareas. Le permite obtener el código devuelto por el programa y acceder al búfer stdout & stderr.
import subprocess
Un ejemplo de interacción con archivos ejecutables en PythonPython - API Win32
La API Win32 es muy útil porque nos dio acceso para transmitir mensajes de teclado y mouse desde Windows desde un script. Por ejemplo, puede crear una función que haga clic con el mouse en ciertas coordenadas X, Y de la pantalla:
import win32api def ClickXY(x,y): win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
Ejemplo de simulación de clic del mouse de PythonIncluso puede enviar eventos de pulsación de teclas al teclado (con o sin modificadores):
import win32api import win32con def PressKey(code, modifierCode=None): if modifierCode: win32api.keybd_event(modifierCode, 0, 0, 0) win32api.keybd_event(code, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) time.sleep(0.021) win32api.keybd_event(code, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) if modifierCode: win32api.keybd_event(modifierCode, 0, win32con.KEYEVENTF_KEYUP, 0)
Ejemplo de simulación de teclado PythonHay muchas otras posibilidades, pero los ejemplos anteriores realmente ayudaron a lograr nuestros objetivos. Puede enviar eventos de teclado a cualquier programa activo y comenzará a escribirlos, como si estuviéramos ingresando algo desde el teclado, incluyendo presionar teclas de acceso rápido.
Python: visión artificial para hacer clic en botones
La experiencia más singular fue el uso de software de visión por computadora en aquellas herramientas que no podían automatizarse mediante scripts internos. La mayoría de las herramientas modernas tienen soporte para secuencias de comandos, pero aún requieren la intervención del usuario. Por ejemplo, 3D Studio Max le permite ejecutar archivos MAXScript desde la línea de comandos. En nuestro caso, ejecutamos el script para importar automáticamente el archivo de malla 3D, después de lo cual 3D Studio Max se inicia automáticamente y muestra el cuadro de diálogo Importar forma, en el que el usuario debe hacer clic en los botones:
Cuadro de diálogo de ejemplo Forma ImportarEntonces, ¿escribimos un script para la automatización, y ahora tenemos que sentarnos frente a la pantalla, presionando las teclas? En lugar de sentarnos en el teclado y esperar a que aparezca la ventana emergente, podemos hacer que el script tome una captura de pantalla, usar el enlace OpenCV a Python para encontrar la plantilla de imagen del botón y hacer clic automáticamente en ella. Así es como se ve la plantilla de imagen para el ejemplo descrito anteriormente.
Plantilla de imagen para ok_button.pngVale la pena señalar que la plantilla de imagen contiene características adicionales (texto para "Objeto único" y "Objetos múltiples"). Esto nos permite obtener un resultado de búsqueda más determinista. El siguiente es un script de Python de ejemplo que se usa para hacer clic automáticamente en una ubicación encontrada de una plantilla de imagen:
import cv2 import ImageGrab
Un ejemplo de hacer clic en un elemento de visualización usando OpenCV, escrito en PythonTodos los ejemplos anteriores se basan en Python. Pero hay momentos en los que necesitamos un control más preciso sobre el sistema de ventanas del sistema operativo Windows. Esto nos llevó a desarrollar herramientas nativas utilizando la API de automatización de Windows.
Windows Native (C ++) - API de automatización de Windows
La API de automatización de Windows proporciona acceso a la API heredada de accesibilidad activa de Microsoft (MSAA), así como a la API de automatización de interfaz de usuario de Microsoft. Puede leer más sobre esto en
la página de Microsoft .
Como resultado, pudimos realizar solicitudes a ciertos elementos de la interfaz de Windows (botones, campos de texto, pestañas, elementos de menú), averiguar dónde están ubicados espacialmente estos elementos en la pantalla y hacer clic / interactuar con ellos. El SDK de Windows también tiene herramientas de prueba que le permiten ver qué propiedades están disponibles. Nos permitieron descubrir qué se puede automatizar en cada programa específico.
La aplicación Inspect.exe es bastante útil para mostrar la jerarquía de la administración de ventanas del programa; proporciona una idea aproximada de dónde se encuentran los objetos, como los controles de menú, y cómo referirse a los elementos de la ventana mediante llamadas a la API de automatización.
Ejemplo Inspect.exeDespués de conocer la jerarquía de control del programa de Windows, sabrá cómo encontrarla desde el identificador de la ventana principal y cómo hacer clic en diferentes elementos a través de la API:
#include <WinUser.h> #include <UIAutomation.h> // Click on a sub-menu item given the Window & Menu handles. void ClickSubMenu(HWND hwnd, HMENU hmenu, const char *pMenuName) { // Iterate through the menu items of the window int menu_item_count = GetMenuItemCount(hmenu); for(int menu_id = 0; menu_id < menu_item_count; ++menu_id) { char menu_name[MAX_PATH]; int len = GetMenuString(hmenu, menu_id, reinterpret_cast<LPSTR>(&menu_name[0]), sizeof(menu_name), MF_BYPOSITION); // Look for the specific menu you're searching for and click it // Make sure to set the window active before doing it... if(!strcmp(pMenuName, menu_name)) { // now get the rect and click the center RECT rect; BOOL success = GetMenuItemRect(hwnd, hmenu, menu_id, &rect); if(success) { SetActiveWindow(hwnd); POINT point = GetMiddlePoint(rect); SetCursorPos(point.x, point.y); mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, point.x, point.y, 0, 0); mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, point.x, point.y, 0, 0); Sleep(DO_TASK_INTERVAL_WAIT_MS); } } } }
Un ejemplo de empujar un control de ventana en C ++Y, por supuesto, pasar pulsaciones de teclas a la ventana activa también es simple:
#include <WinUser.h> #include <UIAutomation.h> // Type the character string to the given window handle static void TypeCharacters(HWND window_handle, const char *pString) { int len = strlen(pString); for(int count = 0; count < len; ++count) { SendMessage(window_handle, WM_CHAR, (WPARAM)pString[count], (LPARAM)0); Sleep(CHARACTER_REPEAT_INTERVAL_MS); } }
Ejemplo de simulación de teclado C ++Por supuesto, estas API tienen muchas más funciones. Descubrí que gracias a la herramienta Inspect.exe, puede arrojar luz sobre a qué elementos de la ventana del programa se puede acceder.
Formatos de texto intermedios
Parte de nuestro flujo de trabajo consistía en guardar los archivos en forma de texto y cambiar los valores en estos archivos de texto. Al final, las herramientas tienen una interfaz de usuario para cambiar el estado de los datos auxiliares. Y si sabe cuáles deberían ser estos datos auxiliares, entonces no es necesario trabajar con la herramienta, simplemente cambie los datos auxiliares. El truco es saber cómo manipular estos datos de soporte; Al cambiar los formatos de archivo propietarios, esto puede ser un desafío. ¿No sería bueno si todos tuvieran un archivo de texto simple con el que puedan trabajar?
El truco es encontrar una forma de evitar los formatos de archivo propietarios utilizados por la mayoría de las herramientas. La solución generalmente es usar las opciones de Importar y Exportar que se encuentran en la mayoría de las herramientas comerciales modernas. Aquí hay algunos ejemplos:
Adobe Premiere Pro guarda los archivos en un formato propietario, pero puede importar / exportar proyectos como Final Cut Pro XML. Después de exportar a XML, puede cambiar el XML de la manera que necesitamos y volver a importar el proyecto a Adobe Premiere Pro.
Otro ejemplo es la corrección de las referencias de textura utilizadas en el obsoleto formato de malla 3D de Autodesk 3D Studio Release 3. Al importar el archivo de malla original, guardamos la malla recién convertida en un archivo intermedio .fbx usando caracteres ASCII. En este formato, puede procesar un archivo de texto y reemplazar todas las líneas de enlaces de textura por las correctas.
Adobe Animate / Flash es bastante divertido, ya que resulta que los archivos .fla en realidad son archivos .zip un poco "rotos". En forma no comprimida, se almacenan en formato XFL, que puede hacer referencia a otros objetos XFL (por ejemplo, mapas de bits) desde una carpeta local. El ingeniero principal de Double Fine, Oliver Franzke, creó un script Python modificado para empaquetar / descomprimir archivos .fla usando ZIP para que podamos crear / modificar estos archivos.
Ejemplos de uso
3D Studio Max
La versión moderna de 3D Studio Max se utilizó para importar el archivo .prj original a la escena y guardarlo en el formato ASCII .fbx. Para cada archivo .prj que necesitaba convertirse, se generó automáticamente un archivo MaxScript (.ms) a partir del script Python, que se parecía a esto:
importFile "G:\FullThrottle_Backup\FullThrottle_SourceAssets\BENBIKE.PRJ"
Ejemplo de importación de un modelo 3D con MaxScriptDespués de eso, este archivo .ms simplemente fue llamado por el comando Python para ejecutarse en 3dsmax.exe:
3dsmax.exe -U MAXScript "C:\FullThrottleRemastered\import_prj.ms"
Un ejemplo de un comando de consola para llamar a un archivo ejecutable con el archivo MaxScript especificadoComo se mencionó anteriormente, en este caso, 3D Studio Max abrió un cuadro de diálogo en el que tuvo que hacer clic. El paquete OpenCV con Python ayudó a hacer clic en el botón en esta ventana para que el archivo original se importe sin intervención del usuario. Después de importar el archivo, se presionó una serie de teclas de menú (usando Win32api Python) para iniciar otro archivo MAXScript, que exportó el modelo como un archivo .fbx en formato ASCII. Como .fbx se guardó como un archivo de texto normal, todas las dependencias de las dependencias de la textura del modelo fueron reemplazadas por enlaces a imágenes en un formato moderno. Luego, el archivo .fbx modificado se volvió a cargar automáticamente en 3DSMax y se exportó como un archivo .max. En este punto, el archivo .max podría enviarse al artista para su remasterización.
Adobe Animate / Flash
Adobe Animate / Flash se utilizó para remasterizar todos los recursos FMV dibujados a mano. Tomamos los marcos originales dibujados a mano (320x200 píxeles de tamaño) encontrados por la herramienta SanWrangler y los usamos como "dibujos de ensamblaje". La escala de la imagen se amplió para adaptarse a 4440x2400 píxeles, después de lo cual se generó automáticamente un archivo .fla utilizando un script Python.
Luego fue suficiente para generar automáticamente el archivo .fla desde cero, utilizando nuestro conocimiento del formato XFL Adobe Animate / Flash. Pudimos usar el kit de herramientas ya creado por Oliver Franzke para generar dibujos de ensamblaje de archivos de animación dibujados a mano.
Adobe Premiere Pro
La API de automatización de Windows realmente nos ayudó a determinar qué controles de Premiere Pro están en la pantalla. En algunos casos, no tenían teclas de acceso rápido. Después de recibir las coordenadas de los elementos del menú, fue necesario mover el cursor a estas coordenadas y enviar un evento de clic del mouse.
Todo esto es genial, pero algunos controles se representan de otras maneras y, por lo tanto, son invisibles para la API de automatización de Windows. Para este caso, decidimos usar un montón de OpenCV y Python para poder usar OpenCV en un entorno de secuencias de comandos. Esto fue especialmente útil al trabajar con Adobe Premiere Pro: aunque tiene soporte parcial para los scripts de JavaScript, el tipo de control necesario no estaba disponible a través de la API.
Además, los archivos de proyecto de Adobe Premiere Pro se almacenan en un formato binario patentado. Por lo tanto, no solo podríamos crear mágicamente el archivo Premiere Pro, sino que podríamos usar la función de importación, que nos permitió importar los datos en el archivo Final Cut Pro, que tiene el formato XML. Luego fue suficiente para generar el archivo XML correcto, posicionar adecuadamente todos los recursos en la línea de tiempo y luego importar automáticamente este .xml Final Cut Pro para convertirlo al formato deseado. Luego podríamos poner los cuadros exportados en una cola automatizada para poder combinarlos en un video terminado.
Todas las etapas
A continuación se muestra un diagrama de bloques generalizado que muestra todas las partes automatizadas de un nuevo flujo de trabajo. Cada segmento automatizado está rodeado por un rectángulo redondeado con información adicional sobre las técnicas de automatización utilizadas.
Diagrama de flujo de automatización FMV remasterizado simplificadoNotarás que la mayor parte del trabajo con Adobe Premiere Pro requiere el uso de Python, así como un código especializado de Windows nativo. La razón es la compleja estructura de las ventanas de Premiere Pro, así como la necesidad de usar la API nativa de automatización de Windows para garantizar una interacción adecuada con todas las ventanas secundarias dependientes de esta aplicación.
Todos juntos
Utilizando los métodos descritos anteriormente, pudimos configurar varias máquinas de automatización para dividir el trabajo en todos los videos en partes. Además, se integró un Slack Bot en el flujo de trabajo para enviar comentarios sobre la automatización a nuestro canal Slack de acuerdo con el estado de los videos que pasan a través de la tubería de procesamiento, para que sepamos cuándo algo sale mal.
Ejemplo de automatización de Adobe Premiere ProLos problemas que enfrentamos
Todo esto suena genial, pero de hecho, al implementar el proyecto, nos encontramos con problemas. Voy a enumerar solo los puntos principales.
1) Iteración de mezclar el audio terminado. La remasterización de todos los archivos de audio se realizó gradualmente. Por lo tanto, cuando tuvimos, por ejemplo, el efecto de sonido "BOOM!", El ingeniero de sonido no tenía idea de dónde insertarlo en la mezcla de audio, por lo que tuvo que esperar a que se codificara el video para descubrir qué había salido mal.
2) Almacenamiento de archivos intermedios sin comprimir. Los cuadros se almacenaron en formato sin comprimir hasta el último momento de codificación en el video terminado. Por lo tanto, era necesario almacenar una gran cantidad de tramas en el almacenamiento local, algunas de las cuales estaban almacenadas en el sistema de control de versiones. Tal aumento en el volumen almacenado fue muy notable y puede ser bastante costoso cuando se usan algunos sistemas de control de versiones (utilizamos Perforce).
3) Plazo de ejecución. Una parte sólida del flujo de trabajo se automatizó, y esto permitió a los ingenieros hacer otras cosas. Sin embargo, el tiempo necesario para crear un video puede ser bastante largo. La parte que consume más tiempo es la codificación de fotogramas en resolución de 4k. Teníamos formas de investigar el estado de los recursos dentro de Perforce para comprender qué pasos deben realizarse de nuevo, pero este método no estaba tan dividido en partes como quisiéramos.
Próximos pasos
Sí, ¡el artículo resultó ser voluminoso! Aunque nuestra implementación de este flujo de trabajo es bastante específica para el proyecto, creo que ciertos métodos de automatización se pueden usar para desarrollar cualquier juego. Después de descubrir el video, puedes considerar un tema relacionado: jugar FMV durante la ejecución del juego. Esto incluye problemas como la codificación de una transmisión de audio multilingüe, así como la sincronización de cuadros cuando se reproduce FMV original. ¡Espera la tercera parte del artículo!