In meinem vorherigen
Beitrag habe ich darüber gesprochen, wie wir Inhalte aus FMV-Quelldateien extrahiert und Tools zum Analysieren von ca. 67 GB Archiven auf der Suche nach Zwischenkomponenten zum Erstellen von FMV erstellt haben. Diese Teile bilden die Grundlage für die Erstellung remasterter FMV-Inhalte und wurden als „Montagezeichnungen“ verwendet, um das Projekt zu starten.
Wie im vorherigen Artikel erwähnt, ist der Remastering-Workflow in drei Zweige unterteilt: Remastering von handgezeichneten Frames, Remastering von 3D-Modellen und Sound-Remastering. Im Folgenden werde ich auf die Funktionen des Workflows und die Tricks eingehen, mit denen wir die Erstellung des Hauptteils des Videos automatisiert haben.
Wir haben die Größe aller handgezeichneten Originalrahmen erhöht, um sie an die Auflösung von 4K (3840 x 2160) anzupassen. Unter Berücksichtigung der zusätzlichen Breite der überarbeiteten Szene und der Tatsache, dass das Spiel in nicht quadratischen Pixeln angezeigt wurde, mussten alle remasterten Ressourcen mit einer Auflösung von 4440 x 2400 Pixel erstellt werden.
Wir haben uns für Adobe Animate entschieden, um alle handgezeichneten FMV-Frames zu remastern, da wir nach der Entwicklung von Day of the Tentacle Remastered bereits einen vorgefertigten Workflow hatten. Das Künstlerteam hat diesen Prozess gut gemeistert, daher haben wir andere Optionen nicht in Betracht gezogen.
Beispiel für das Remastering eines handgezeichneten RahmensDie ursprünglichen 3D-Modelle aus den Archiven befanden sich in 3D Studio Release 3. Glücklicherweise konnten moderne Versionen von 3D Studio Max alle Daten der Netze und filmischen Keyframes mithilfe eines anderen Automatisierungsskripts importieren. Danach haben wir diese Zwischendatei in Autodesk Maya konvertiert, wo Künstler ihre Remastering-Magie ausführen.
Um den Oberflächen der Netze einen neuen Stil zu verleihen, wurden neue Shader angewendet, hochwertige Texturen angewendet und diese Netze wurden erheblich ergänzt, um dem Modell ein glatteres Aussehen zu verleihen. Darüber hinaus wurde das Rahmenfenster für alle Videoaufnahmekameras erweitert, um einer Arbeitsauflösung von 4440 x 2400 Pixel zu entsprechen, da die Originalkamera für ein engeres Seitenverhältnis ausgelegt war.
Beispiel für das Remastering von 3D-ModellenIn Bezug auf Audio konnten wir die meisten hochwertigen Originalversionen finden, aber es gab Ausnahmen. Die Aufnahmen des englischsprachigen Synchronstudios wurden in Archive gepackt, aber das Synchronisieren in anderen Sprachen, die von externen Partnern durchgeführt wurden, stand uns nicht zur Verfügung. Außerdem haben wir es geschafft, die Originalmusik von The Gone Jackals zu finden, die in FMV verwendet wurde. Einige Versionen von Soundeffekten (SFX) wurden durch "dichtere" Klänge mit einer ähnlichen Klangart ersetzt.
Im Folgenden finden Sie ein Flussdiagramm, in dem grob erläutert wird, wie wir die Quellressourcen verarbeitet und mit remasterten Inhalten verknüpft haben. Die ursprünglich extrahierten (mit SanExtract.exe) Videobilder wurden als „Quelle“ für den Vergleich mit allen Archivdatendateien verwendet. Archivmanifestdateien werden mithilfe einer rekursiven Suche aller Archivdaten generiert. Sie wurden verwendet, um schnell alle eindeutigen Dateien eines bestimmten Typs zu finden.
Das SanWrangler-Tool wurde verwendet, um die ursprüngliche „Quelle“ von Frames und archivierten Daten visuell zu vergleichen. Der Benutzer kann Archivdateien visuell an die Originalrahmen anhängen und diese als Abhängigkeitskarte im XML-Format speichern. Nach dem Erstellen der Abhängigkeitszuordnung war es ausreichend, ein Python-Skript zu verwenden, um automatisch manuell gezeichnete Rahmen aus den ursprünglichen Ressourcen der Zeichnungsdatei sowie aus Baugruppenzeichnungen für Maya 3D zu generieren. Diese Dateien wurden zum Ausgangspunkt für das Künstlerteam, das dann mit dem Remastering fortfuhr.
Originalressourcen extrahieren und „Montagezeichnungen“ erstellenDies war der erste von vielen Schritten, die dazu führten, dass wir fertige FMV-Remaster-Versionen erhielten. Ja, natürlich haben wir jetzt den Ausgangspunkt aller Dateien, die erneut erstellt werden müssen, aber wie können alle diese Fragmente miteinander verbunden werden?
Im Folgenden werde ich auf die Automatisierungsmethoden eingehen, die im FMV-Fertigungsworkflow verwendet werden. Diese Methoden können nicht nur zum Generieren von FMV verwendet werden und gelten nicht nur für ein Spiel. Ich denke, sie sind ziemlich universell und können in vielen Aspekten der Spieleentwicklung verwendet werden.
Wie bei den meisten Workflows zur Grafikerstellung ist dieser Prozess iterativ. Irgendwo in der Quelldatei kann es einen Fehler geben, der vom Künstler behoben werden muss, und manchmal war es notwendig, ressourcenabhängige Dateien erneut zu exportieren. Ich denke, wir alle würden es vorziehen, wenn diese Arbeit von einem Computer und nicht von einer fehleranfälligen Person ausgeführt wird.
Wir wussten genau, wie das Video für Full Throttle Remastered aussehen und klingen sollte, daher mussten wir nur die Grafik und den Sound verbessern. Alle Videos mussten Frame für Frame mit den Originalen übereinstimmen, einschließlich Kamerapfaden, Tonlautstärke, Schwenken usw. Um dies zu erreichen, mussten wir wissen, wie der Workflow beim Erstellen von Original-FMVs aussah. Und diese 67 GB Daten aus den LucasArts-Archiven enthielten viele Hinweise darauf, wie alles im Original funktionierte. Sie waren ein großartiger Start für uns.
Der Prozess der Erstellung des ursprünglichen FMV
Es mag ein wenig nostalgisch klingen, aber ich denke, es ist wichtig, die Aspekte der „digitalen Archäologie“ dieses Remasters von Spielen zu diskutieren. Wenn Sie den Prozess der Erstellung des Originals verstehen, können Sie viele Fragen beantworten und Hinweise geben, wie aus Ressourcen ein fertiges Ergebnis wurde. Und wenn wir neue überarbeitete FMVs erstellen, müssen wir dieselben Transformationen auf unsere ursprünglichen überarbeiteten Ressourcen anwenden, damit das fertige Produkt dem Original so nahe wie möglich kommt. Einschließlich brauchten wir Folgendes:
- Position der Audiospuren auf der Timeline
- Lautstärke- und Schwenkeinstellungen für Audiospuren beim Spielen im Spiel
- Rahmenzusammensetzung und Platzierung jedes Videorahmens im fertigen Produkt
Mit einem Tool namens SMUSHFT (SMUSH für Vollgas) konnte der Ersteller von FMV Video- und Audioressourcen auf der Timeline platzieren und dann den resultierenden FMV-Film (im .san-Format) codieren, der von der Spiel-Engine gelesen wurde. Alle Videos wurden in eine Reihe von Frames unterteilt, die zusammengeklebt wurden, um das Endergebnis zu erzielen. Mit SMUSHFT konnte der Benutzer diese Ressourcen visuell entlang der Zeitachse verschieben und das Video bei Bedarf wiederholen.
Sie können nicht erwähnen, dass ich nicht an der Erstellung des Originalspiels teilgenommen habe. Ich konnte nur raten, wie die ursprünglichen Ressourcen erstellt wurden, archivierte Daten studierten und Formate und ausführbare Dateien betrachteten, die in diese Daten gepackt waren. Es scheint, dass 3D-Modelle in Autodesk 3D Studio Release 3 erstellt wurden und handgezeichnete Teile in DeluxePaint Animation v1.0 erstellt wurden. Ich weiß auch nicht, aus welchen Stufen die Erzeugung von Wellenformdaten für Audio bestand, aber jeder verwendete Audioclip (im .sad-Format) enthält Informationen über die Lautstärke und das Schwenken nach Keyframes, die zum Mischen von Sound während des Spiels verwendet werden.
Der Prozess der Erstellung des ursprünglichen FMVNach dem Erstellen dieser separaten Teile des Rahmens wurde der Prozess des Kombinierens des Rahmens durchgeführt. Bei diesem Prozess wurden 3D-Frame-Renderings mit handgezeichneten Animationsframes (zusammen mit allem anderen) kombiniert und ein fertiges Produkt erstellt, das vom SMUSHFT-Tool verwendet wird (.nut-Dateien). Nachdem das Projekt für die Codierung bereit war, wurde das Video verarbeitet und das fertige Ergebnis (.san) konnte bereits in der Spiel-Engine abgespielt werden.
SMUSHFT führte die endgültige Codierung des Dateiformats des Originalvideos (.san) durch, und jede Videodatei verfügte über eine Projektdatei (.pro), die die Zusammenstellung des Videos (Ton, Video, Position der Untertitel) beschrieb. Wir wollten diese Informationen extrahieren, damit wir die Adobe Premiere Pro-Projektdatei generieren und damit die konvertierte Version des Videos in 4K-Auflösung codieren können. Dazu mussten wir die SMUSHFT-Projektdatei zurückentwickeln.
Reverse Engineering-Dateiformate
Es ist großartig, Quellcode zu haben, da Sie ihn einfach studieren und verstehen können, wie die Projektdatei erstellt / gelesen wurde. Ohne Quellcode müssen Sie die Projektdatei in einem Hex-Editor öffnen und die Muster in der Datei analysieren. Genau so haben wir nützliche Inhalte aus der SMUSHFT-Projektdatei extrahiert.
Da wir die ursprüngliche SMUSHFT in DOSBox ausführen konnten, sahen wir die Benutzeroberfläche des Programms, die uns Hinweise zum Dateiformat gab. Schauen Sie sich diesen Screenshot zum Öffnen der ursprünglichen .pro-Datei an:
Beispiel für ein SMUSHFT-ProjektHier können Sie Folgendes feststellen: Die Datei enthält benannte Ressourcen (2027.NUT, 2027.SAD, IN_06A.NUT usw.). Solche benannten Ressourcen zeigen wahrscheinlich ASCII-Zeichen in der Datei an. Darüber hinaus befinden sich am oberen Rand der Timeline Frame-Zähler, und links von der Timeline befinden sich zunehmende Layernummern. Und die letzte - jede Ressource auf der Timeline befindet sich auf einer bestimmten Frame-Nummer und hat eine bestimmte Dauer. Wenn wir diese Informationen aus den ursprünglichen Projektdateien extrahieren können, erfahren wir, wo automatisch neue Ressourcen in der Adobe Premiere Pro-Zeitleiste platziert werden.
Beispielprojekt für Adobe Premiere ProWenn Sie die ursprüngliche Projektdatei in einem Hex-Editor öffnen, erhalten Sie einige nützliche Informationen. Schauen Sie sich das obige Beispiel hexadezimal an:
SMUSHFT-Projektdatei im Hex-EditorWir können die .pro-Datei mit einem Hex-Editor (ich bevorzuge Hexplorer) betrachten und versuchen, nach Mustern zu suchen. Sie können benannte Ressourcen im ASCII-Format mit einem Null-Byte am Ende leicht finden. Ungefähr im selben Speicherbereich befindet sich eine Gruppe von Werten, die als Kurzschlüsse gespeichert sind (Doppelbyte-Ganzzahl). Vergleichen der in SMUSHFT angezeigten Zahlen mit
Die Zahlen aus der Projektdatei im Hex-Format geben uns die Grundlage für die korrekte Konvertierung der ursprünglichen Projektdatei in einen modernen Videoeditor wie Adobe Premiere Pro.
Automatisierungs-Toolkit
Der Großteil dieses Workflows war automatisiert und erforderte kein menschliches Eingreifen. Einer der Gründe dafür war, dass der Inhalt aller Videos vollständig vom Original kopiert wurde. Tatsächlich haben wir nur den Inhalt aktualisiert. Daher hatten wir praktisch keine Gelegenheit, das FMV-Format vollständig zu ändern. Wir mussten nur einen Weg finden, um das Video mit hochauflösenden Ressourcen neu zu erstellen und gleichzeitig den Zeitaufwand für das Produkt zu minimieren.
Zunächst muss ich sagen, dass ein ernsthafter erster Schritt vor der Automatisierung des gesamten Prozesses ein Gespräch mit einem Team von Inhaltserstellern (Grafik und Audio) sein sollte. Der Grund dafür ist, dass bei den meisten Automatisierungsprozessen die Ersteller bestimmte Regeln für die Vorbereitung von Projekten, Speicherorten, verwendeten Tools usw. einhalten müssen. In unserem Projekt bedeutete dies, dass wir Werkzeuge zum Erstellen des Inhalts von handgezeichneten Rahmen, 3D-Modellen und Sounds diskutieren und dann einen Video-Editor, um all dies zusammenzusetzen. Es musste auch vereinbart werden, welche Teile des Workflows manuell ausgeführt und welche automatisiert werden.
Infolgedessen haben wir Folgendes entschieden:
- Manuell gezeichnete Frames werden in Adobe Animate mit einer Auflösung von 4440 x 2400 Pixel erstellt.
- 3D-Modelle und -Animationen werden in Autodesk Maya erstellt und manuell gerendert, ebenfalls mit einer Auflösung von 4440 x 2400 Pixel
- Audiodateien werden im WAV-Format mit 48-kHz- und 16-Bit-Parametern erstellt
- Fragmente des Videos werden zunächst automatisch generiert, und der Künstler kann jeden Teil ändern, den er benötigt (mit einigen Ausnahmen).
- Die letzten Schritte des Zusammenfügens und Codierens von FMV werden automatisiert
Um die Tools so automatisiert wie möglich zu gestalten, haben wir verschiedene Methoden verwendet. Python wurde als „Klebstoff“ ausgewählt, der alles miteinander verbindet, da es durch verschiedene Bibliotheken gut erweitert wird und der Code einfach zu schreiben und zu warten ist. Wir haben auch die interne Unterstützung für plattformunabhängige Dateimanipulationen (Kopieren, Verschieben, Löschen) genutzt.
Python - Ausführen von ausführbaren Dateien, Erhalten von Ergebnissen
Die Python-Unterprozessbibliothek war ideal für uns, da Sie damit die Ausführung anderer ausführbarer Dateien ändern und sogar auf den Abschluss ihrer Aufgaben warten können. Sie können den vom Programm zurückgegebenen Code abrufen und auf den Puffer stdout & stderr zugreifen.
import subprocess
Ein Beispiel für die Interaktion mit ausführbaren Dateien in PythonPython - Win32 API
Die Win32-API ist sehr nützlich, da sie uns den Zugriff auf die Übertragung von Tastatur- und Mausnachrichten von Windows über ein Skript ermöglichte. Sie können beispielsweise eine Funktion erstellen, die in bestimmten X- und Y-Koordinaten des Bildschirms mit der Maus klickt:
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)
Beispiel für eine Python-MausklicksimulationSie können sogar Tastenanschlagereignisse an die Tastatur senden (mit oder ohne Modifikatoren):
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)
Beispiel für eine Python-TastatursimulationEs gibt viele andere Möglichkeiten, aber die obigen Beispiele haben wirklich dazu beigetragen, unsere Ziele zu erreichen. Sie können Tastaturereignisse an jedes aktive Programm senden, und es beginnt mit der Eingabe, als würden wir etwas über die Tastatur eingeben, einschließlich des Drückens von Tastenkombinationen.
Python - Computer Vision zum Klicken auf Schaltflächen
Die einzigartigste Erfahrung war die Verwendung von Computer Vision-Software in Tools, die nicht durch interne Skripte automatisiert werden konnten. Die meisten modernen Tools unterstützen Skripte, erfordern jedoch immer noch Benutzereingriffe. Mit 3D Studio Max können Sie beispielsweise MAXScript-Dateien über die Befehlszeile ausführen. In unserem Fall führen wir das Skript aus, um die 3D-Netzdatei automatisch zu importieren. Anschließend wird 3D Studio Max automatisch gestartet und das Dialogfeld Formimport angezeigt, in dem der Benutzer auf die Schaltflächen klicken muss:
Beispieldialogfeld FormimportAlso - wir haben ein Skript für die Automatisierung geschrieben, und jetzt müssen wir vor dem Bildschirm sitzen und die Tasten drücken? Anstatt an der Tastatur zu sitzen und darauf zu warten, dass das Popup-Fenster angezeigt wird, können wir das Skript einen Screenshot machen lassen, die OpenCV-Bindung an Python verwenden, um die Schaltflächenbildvorlage zu finden und automatisch darauf zu klicken. So sieht die Bildvorlage für das oben beschriebene Beispiel aus.
Bildvorlage für ok_button.pngEs ist zu beachten, dass die Bildvorlage zusätzliche Funktionen enthält (Text für „Einzelobjekt“ und „Mehrere Objekte“). Dies ermöglicht es uns, ein deterministischeres Suchergebnis zu erhalten. Das folgende Beispiel ist ein Python-Skript, mit dem automatisch auf einen gefundenen Speicherort einer Bildvorlage geklickt wird:
import cv2 import ImageGrab
Ein Beispiel für das Klicken auf ein Anzeigeelement mit OpenCV, geschrieben in PythonAlle obigen Beispiele basieren auf Python. Es gibt jedoch Zeiten, in denen wir eine genauere Kontrolle über das Windows-Betriebssystem-Fenstersystem benötigen. Dies führte dazu, dass wir native Tools mithilfe der Windows-Automatisierungs-API entwickelten.
Windows Native (C ++) - Windows-Automatisierungs-API
Die Windows-Automatisierungs-API bietet Zugriff auf die ältere Microsoft Active Accessibility-API (MSAA) sowie auf die Microsoft UI-Automatisierungs-API. Weitere Informationen hierzu finden Sie auf
der Microsoft-Seite .
Als Ergebnis haben wir die Tatsache erreicht, dass wir bestimmte Elemente der Windows-Oberfläche (Schaltflächen, Textfelder, Registerkarten, Menüelemente) anfordern, herausfinden konnten, wo sich diese Elemente räumlich auf dem Bildschirm befinden, und mit ihnen klicken / interagieren konnten. Das Windows SDK verfügt auch über Testtools, mit denen Sie sehen können, welche Eigenschaften verfügbar sind. Sie ermöglichten es uns herauszufinden, was in jedem spezifischen Programm automatisiert werden kann.
Die Inspect.exe-Anwendung ist sehr nützlich, um die Hierarchie der Programmfensterverwaltung anzuzeigen. Es bietet eine ungefähre Vorstellung davon, wo sich Objekte wie Menüsteuerelemente befinden und wie mithilfe von Automatisierungs-API-Aufrufen auf Fensterelemente verwiesen wird.
Beispiel Inspect.exeNachdem Sie die Steuerelementhierarchie des Windows-Programms kennengelernt haben, erfahren Sie, wie Sie sie im Handle des Hauptfensters finden und wie Sie über die API auf verschiedene Elemente klicken:
#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); } } } }
Ein Beispiel für das Verschieben eines Fenstersteuerelements in C ++Das Übergeben von Tastenanschlägen an das aktive Fenster ist natürlich auch einfach:
#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); } }
Beispiel für eine C ++ - TastatursimulationNatürlich haben diese APIs viel mehr Funktionen. Ich habe festgestellt, dass Sie dank des Tools Inspect.exe Aufschluss darüber geben können, auf welche Elemente des Programmfensters zugegriffen werden kann.
Zwischentextformate
Ein Teil unseres Workflows bestand darin, die Dateien in Textform zu speichern und die Werte in diesen Textdateien zu ändern. Am Ende haben die Werkzeuge eine Benutzeroberfläche zum Ändern des Status der Hilfsdaten. Und wenn Sie wissen, wie diese Hilfsdaten aussehen sollen, müssen Sie nicht mit dem Tool arbeiten, sondern nur die Hilfsdaten ändern. Der Trick besteht darin, zu wissen, wie diese unterstützenden Daten manipuliert werden. Wenn Sie proprietäre Dateiformate ändern, kann dies eine Herausforderung sein. Wäre es nicht schön, wenn jeder eine einfache Textdatei hätte, mit der Sie arbeiten können?
Der Trick besteht darin, einen Weg zu finden, um die proprietären Dateiformate zu umgehen, die von den meisten Tools verwendet werden. Die Lösung besteht normalerweise darin, die Import- und Exportoptionen zu verwenden, die in den meisten modernen kommerziellen Tools zu finden sind. Hier einige Beispiele:
Adobe Premiere Pro speichert Dateien in einem proprietären Format. Sie können Projekte jedoch als Final Cut Pro XML importieren / exportieren. Nach dem Export in XML können Sie das XML nach Bedarf ändern und das Projekt wieder in Adobe Premiere Pro importieren.
Ein weiteres Beispiel ist die Korrektur von Texturreferenzen, die im veralteten 3D-Netzformat von Autodesk 3D Studio Release 3 verwendet werden. Beim Importieren der ursprünglichen Netzdatei speichern wir das neu konvertierte Netz mithilfe von ASCII-Zeichen in einer .fbx-Zwischendatei. In diesem Format können Sie eine Textdatei verarbeiten und alle Zeilen von Texturverknüpfungen durch die richtigen ersetzen.
Adobe Animate / Flash ist ziemlich lustig, da sich herausstellt, dass .fla-Dateien tatsächlich etwas "kaputte" .zip-Dateien sind. In unkomprimierter Form werden sie im XFL-Format gespeichert, das auf andere XFL-Objekte (z. B. Bitmaps) aus einem lokalen Ordner verweisen kann. Oliver Franzke, leitender Ingenieur von Double Fine, hat ein modifiziertes Python-Skript zum Packen / Entpacken von .fla-Dateien mithilfe von ZIP erstellt, damit wir diese Dateien erstellen / ändern können.
Anwendungsbeispiele
3D Studio max
Die moderne Version von 3D Studio Max wurde verwendet, um die ursprüngliche PRJ-Datei in die Szene zu importieren und im ASCII-Format .fbx zu speichern. Für jede .prj-Datei, die konvertiert werden musste, wurde automatisch eine MaxScript-Datei (.ms) aus dem Python-Skript generiert, die ungefähr so aussah:
importFile "G:\FullThrottle_Backup\FullThrottle_SourceAssets\BENBIKE.PRJ"
Beispiel für den Import eines 3D-Modells mit MaxScriptDanach wurde diese MS-Datei einfach vom Python-Befehl aufgerufen, um in 3dsmax.exe ausgeführt zu werden:
3dsmax.exe -U MAXScript "C:\FullThrottleRemastered\import_prj.ms"
Ein Beispiel für einen Konsolenbefehl zum Aufrufen einer ausführbaren Datei mit der angegebenen MaxScript-DateiWie oben erwähnt, öffnete 3D Studio Max in diesem Fall ein Dialogfeld, auf das Sie klicken mussten. Das OpenCV-Bundle mit Python hat dazu beigetragen, auf die Schaltfläche in diesem Fenster zu klicken, damit die Originaldatei ohne Benutzereingriff importiert wird. Nach dem Importieren der Datei wurde eine Reihe von Menütasten (unter Verwendung von win32api Python) gedrückt, um eine weitere MAXScript-Datei zu starten, die das Modell als .fbx-Datei im ASCII-Format exportierte. Da .fbx als reguläre Textdatei gespeichert wurde, wurden alle Abhängigkeiten der Modelltexturabhängigkeiten durch Links zu Bildern in einem modernen Format ersetzt. Anschließend wurde die geänderte .fbx-Datei erneut automatisch in 3DSMax geladen und als .max-Datei exportiert. Zu diesem Zeitpunkt könnte die .max-Datei zum Remastering an den Künstler gesendet werden.
Adobe Animate / Flash
Adobe Animate / Flash wurde verwendet, um alle handgezeichneten FMV-Ressourcen zu remastern. Wir haben die vom SanWrangler-Tool gefundenen handgezeichneten Originalrahmen (320 x 200 Pixel groß) als „Montagezeichnungen“ verwendet. Der Bildmaßstab wurde auf 4440 x 2400 Pixel vergrößert. Anschließend wurde mithilfe eines Python-Skripts automatisch eine .fla-Datei generiert.
Dann genügte es, die .fla-Datei automatisch von Grund auf neu zu generieren, wobei wir unser Wissen über das XFL-Format Adobe Animate / Flash nutzten. Mit dem bereits von Oliver Franzke erstellten Toolkit konnten wir Montagezeichnungen von handgezeichneten Animationsdateien erstellen.
Adobe Premiere Pro
Die Windows-Automatisierungs-API hat uns wirklich dabei geholfen, festzustellen, welche Premiere Pro-Steuerelemente auf dem Bildschirm angezeigt werden. In einigen Fällen hatten sie keine Hotkeys. Nach dem Empfang der Koordinaten der Menüelemente musste der Cursor auf diese Koordinaten bewegt und ein Mausklickereignis gesendet werden.
All dies ist großartig, aber einige Steuerelemente werden auf andere Weise gerendert und sind daher für die Windows-Automatisierungs-API nicht sichtbar. In diesem Fall haben wir uns für OpenCV und Python entschieden, um OpenCV in einer Skriptumgebung verwenden zu können. Dies war besonders nützlich, wenn Sie mit Adobe Premiere Pro arbeiten: Obwohl JavaScript-Skripts teilweise unterstützt werden, war die Art der erforderlichen Steuerung über die API nicht verfügbar.
Darüber hinaus werden Adobe Premiere Pro-Projektdateien in einem proprietären Binärformat gespeichert. Daher konnten wir die Premiere Pro-Datei nicht nur auf magische Weise erstellen, sondern auch die Importfunktion verwenden, mit der wir die Daten in die Final Cut Pro-Datei im XML-Format importieren konnten. Dann genügte es, die richtige XML-Datei zu generieren, alle Ressourcen auf der Timeline entsprechend zu positionieren und diese XML-Datei Final Cut Pro automatisch zu importieren, um sie in das gewünschte Format zu konvertieren. Dann könnten wir die exportierten Frames in eine automatisierte Warteschlange stellen, um sie zu einem fertigen Video zu kombinieren.
Alle Stufen
Unten finden Sie ein verallgemeinertes Blockdiagramm, das alle automatisierten Teile eines neuen Workflows zeigt. Jedes automatisierte Segment ist von einem abgerundeten Rechteck mit zusätzlichen Informationen zu den verwendeten Automatisierungstechniken umgeben.
Vereinfachtes überarbeitetes FMV-AutomatisierungsflussdiagrammSie werden feststellen, dass für die meisten Arbeiten mit Adobe Premiere Pro Python sowie spezieller nativer Windows-Code erforderlich sind. Der Grund ist die komplexe Struktur von Premiere Pro-Fenstern sowie die Notwendigkeit, die native Windows-Automatisierungs-API zu verwenden, um eine ordnungsgemäße Interaktion mit allen abhängigen untergeordneten Fenstern dieser Anwendung sicherzustellen.
Alle zusammen
Mit den oben beschriebenen Methoden konnten wir mehrere Automatisierungsmaschinen konfigurieren, um die Arbeit an allen Videos in Teile aufzuteilen. Außerdem wurde ein Slack Bot in den Workflow integriert, um je nach Status der Videos, die die Verarbeitungspipeline durchlaufen, Feedback zur Automatisierung an unseren Slack-Kanal zu senden, damit wir wissen, wenn etwas schief geht.
Beispiel für die Automatisierung von Adobe Premiere ProDie Probleme, mit denen wir konfrontiert sind
Das klingt alles großartig, aber tatsächlich sind wir bei der Implementierung des Projekts auf Probleme gestoßen. Ich werde nur die Hauptpunkte auflisten.
1) Iteration des Mischens des fertigen Audios. Das Remastering aller Audiodateien wurde schrittweise durchgeführt. Als wir zum Beispiel den Soundeffekt „BOOM!“ Hatten, hatte der Toningenieur keine Ahnung, wo er in den Audio-Mix eingefügt werden sollte, und musste warten, bis das Video codiert war, um herauszufinden, was schief gelaufen war.
2) Speicherung unkomprimierter Zwischendateien. Die Frames wurden bis zum letzten Moment der Codierung in das fertige Video im unkomprimierten Format gespeichert. Daher war es notwendig, eine große Anzahl von Frames im lokalen Speicher zu speichern, von denen einige im Versionskontrollsystem gespeichert waren. Eine solche Erhöhung des gespeicherten Volumens war sehr auffällig und kann bei Verwendung einiger Versionskontrollsysteme (wir haben Perforce verwendet) recht teuer sein.
3) Vorlaufzeit. Ein fester Teil des Workflows wurde automatisiert, und dies ermöglichte den Ingenieuren, andere Dinge zu tun. Die Zeit zum Erstellen eines Videos kann jedoch sehr lang sein. Der zeitaufwändigste Teil ist das Codieren von Frames in 4k-Auflösung. Wir hatten Möglichkeiten, den Zustand der Ressourcen in Perforce zu untersuchen, um zu verstehen, welche Schritte erneut ausgeführt werden müssen, aber diese Methode war nicht so in Teile unterteilt, wie wir es gerne hätten.
Nächste Schritte
Ja, der Artikel erwies sich als umfangreich! Obwohl unsere Implementierung dieses Workflows für das Projekt sehr spezifisch ist, glaube ich, dass bestimmte Automatisierungsmethoden bei der Entwicklung jedes Spiels verwendet werden können. Nachdem Sie das Video herausgefunden haben, können Sie ein verwandtes Thema betrachten - das Spielen von FMV während der Spielausführung. Dies umfasst Probleme wie das Codieren eines mehrsprachigen Audiostreams sowie die Framesynchronisation bei der Wiedergabe von Original-FMV. Warten Sie auf den dritten Teil des Artikels!