كيفية استعادة ملفات الفيديو ل Full Throttle Remastered. الجزء 2

الصورة

في رسالتي السابقة ، تحدثت عن كيفية استخلاص المحتوى من ملفات FMV المصدر وإنشاء أدوات لتحليل ما يقرب من 67 غيغابايت من الأرشيفات بحثًا عن المكونات الوسيطة المستخدمة لإنشاء FMV. هذه الأجزاء هي الأساس لإنشاء محتوى FMV معاد استخدامه وتم استخدامها كـ "رسومات تجميع" لبدء المشروع.

كما هو مذكور في المقالة السابقة ، ينقسم تدفق العمل المعاد تشكيله إلى ثلاثة فروع: إعادة تشكيل الإطارات المرسومة يدويًا ، وإعادة تشكيل النماذج ثلاثية الأبعاد وإعادة تشكيل الصوت. أدناه سوف أتحدث عن ميزات سير العمل والحيل التي استخدمناها لأتمتة إنشاء الجزء الرئيسي من الفيديو.

قمنا بزيادة حجم جميع الإطارات الأصلية المرسومة يدويًا لتتناسب مع دقة 4K (3840x2160). مع الأخذ في الاعتبار إضافة عرض المشهد المعاد صياغته وحقيقة أن اللعبة تم عرضها في وحدات بكسل غير مربعة ، فإن هذا يعني أنه يجب إنشاء جميع الموارد المعاد إنشاؤها بدقة 4440x2400 بكسل.

قررنا استخدام Adobe Animate لإعادة تصميم جميع إطارات FMV المرسومة يدويًا ، لأن لدينا بالفعل سير عمل جاهز بعد تطوير يوم من Tentacle Remastered. لقد أتقن فريق الفنانين هذه العملية جيدًا ، لذلك لم نفكر في خيارات أخرى.


مثال على إعادة تشكيل إطار مرسومة يدويًا

كانت النماذج ثلاثية الأبعاد الأصلية من الأرشيفات موجودة في الإصدار 3 من برنامج Studio 3. لحسن الحظ ، كانت الإصدارات الحديثة من برنامج 3D Studio Max قادرة على استيراد جميع بيانات الشبكات والإطارات الرئيسية السينمائية باستخدام برنامج نصي آخر. بعد ذلك ، قمنا بتحويل هذا الملف الوسيط للعمل في Autodesk Maya ، حيث يقوم الفنانون بإعادة صياغة سحرهم.

لإعطاء أسطح الشبكات نمطًا جديدًا ، تم تطبيق تظليل جديد ، تم تطبيق مواد عالية الجودة ، وتم استكمال هذه الشبكات بشكل كبير لإعطاء النموذج مظهرًا أكثر سلاسة. بالإضافة إلى ذلك ، تم توسيع نافذة الإطار لجميع كاميرات التقاط الفيديو لتتوافق مع دقة عمل تبلغ 4440 × 2400 بكسل ، لأن الكاميرا الأصلية تم تصميمها لنسبة عرض إلى جانب أضيق.


مثال على إعادة تشكيل النماذج ثلاثية الأبعاد

أما بالنسبة للصوت ، فقد تمكنا من العثور على معظم الإصدارات الأصلية عالية الجودة ، ولكن كانت هناك استثناءات. تم تجميع تسجيلات استوديو الدبلجة باللغة الإنجليزية في أرشيفات ، ولكن الدبلجة بلغات أخرى ، والتي تم إشراكها من قبل شركاء خارجيين ، لم تكن متاحة لنا. بالإضافة إلى ذلك ، تمكنا من العثور على الموسيقى الأصلية لـ The Gone Jackals ، والتي تم استخدامها في FMV. تم استبدال بعض إصدارات المؤثرات الصوتية (SFX) بمزيد من الصوت "المحكم" بنوع مماثل من الصوت.

يوجد أدناه مخطط انسيابي يشرح تقريبًا كيفية معالجتنا لمصادر المصدر وربطها بالمحتوى المعاد تحويله. تم استخدام إطارات الفيديو الأصلية المستخرجة (باستخدام SanExtract.exe) كمصدر للمقارنة مع جميع ملفات بيانات الأرشيف. يتم إنشاء ملفات بيان الأرشيف باستخدام البحث العودي لجميع بيانات الأرشيف ؛ تم استخدامها للعثور بسرعة على جميع الملفات الفريدة من نوع معين.

تم استخدام أداة SanWrangler لمقارنة "المصدر" الأصلي للإطارات والبيانات المؤرشفة. يمكن للمستخدم إرفاق ملفات الأرشيف بصريًا بالإطارات الأصلية وحفظها كخريطة تبعية بتنسيق XML. بعد إنشاء خريطة التبعية ، كان يكفي استخدام نص Python النصي لإنشاء إطارات مرسومة يدويًا تلقائيًا من موارد ملف "الرسم" الأصلية ، بالإضافة إلى "رسومات التجميع" لـ Maya 3D. أصبحت هذه الملفات نقطة البداية لفريق الفنانين ، الذين انتقلوا بعد ذلك إلى إعادة التشكيل.


استخراج الموارد الأصلية وإنشاء "رسومات التجميع"

كانت هذه هي الخطوة الأولى من العديد من الخطوات التي أدت إلى حصولنا على إصدارات FMV معاد تصنيعها جاهزة. نعم ، بالطبع ، لدينا الآن نقطة البداية لجميع الملفات التي يجب إعادة بنائها ، ولكن كيف نربط كل هذه الأجزاء معًا؟

أدناه سوف أتحدث عن طرق الأتمتة المستخدمة في سير عمل التصنيع FMV. يمكن استخدام هذه الطرق ليس فقط لتوليد FMV وتطبيقها ليس فقط على لعبة واحدة ؛ أعتقد أنها عالمية تمامًا ، ويمكن استخدامها في العديد من جوانب تطوير اللعبة.

مثل معظم سير عمل إنشاء الرسومات ، ستكون هذه العملية تكرارية. في مكان ما في الملف المصدر ، قد يكون هناك خطأ يجب إصلاحه بواسطة الفنان ، وأحيانًا كان من الضروري إعادة تصدير الملفات المعتمدة على الموارد. أعتقد أننا جميعًا نفضل أن يتم هذا العمل عن طريق الكمبيوتر ، بدلاً من شخص معرض للخطأ.

لقد عرفنا بالضبط كيف يجب أن يبدو الفيديو والصوت لـ Full Throttle Remastered ، لذلك نحن بحاجة فقط لتحسين رسوماتهم وصوتهم. يجب أن تتطابق جميع مقاطع الفيديو مع النسخ الأصلية ، إطارًا بإطار ، بما في ذلك مسارات الكاميرا وحجم الصوت والتحريك ، إلخ. لتحقيق ذلك ، كنا بحاجة إلى معرفة كيف يبدو سير العمل لإنشاء FMVs الأصلي. وتحتوي هذه البيانات البالغة 67 غيغابايت من أرشيف LucasArts على الكثير من الأدلة حول كيفية عمل كل شيء في الأصل. لقد كانت بداية رائعة لنا.

عملية إنشاء FMV الأصلي


قد يبدو الأمر حنينًا إلى حد ما ، ولكن أعتقد أنه من المهم مناقشة جوانب "علم الآثار الرقمية" لإعادة تشكيل الألعاب. في النهاية ، سيسمح لك فهم عملية إنشاء الأصل بالإجابة على العديد من الأسئلة وإعطاء أدلة حول كيفية تحول الموارد إلى نتيجة نهائية. وعند إنشاء FMVs جديدة ، نحتاج إلى تطبيق نفس التحويلات على مواردنا الأصلية المعاد تحويلها بحيث يبدو المنتج النهائي قريبًا قدر الإمكان من الأصلي. بما في ذلك نحن بحاجة إلى ما يلي:

  • موقع المسارات الصوتية على الخط الزمني
  • إعدادات الصوت وعموم المسارات الصوتية عند اللعب في اللعبة
  • تكوين الإطار ووضع كل إطار فيديو في المنتج النهائي

سمحت أداة تسمى SMUSHFT (SMUSH for Full Throttle) لمنشئ FMV بوضع موارد الفيديو والصوت على المخطط الزمني ، ثم ترميز فيلم FMV الناتج (بتنسيق .san) ، والذي تمت قراءته بواسطة محرك اللعبة. تم تقسيم جميع مقاطع الفيديو إلى سلسلة من الإطارات التي تم لصقها معًا لإنشاء النتيجة النهائية. سمح SMUSHFT للمستخدم بنقل هذه الموارد بشكل مرئي على طول المخطط الزمني ، وإذا لزم الأمر ، إعادة الفيديو.

لا يمكنك أن تذكر أنني لم أشارك في إنشاء اللعبة الأصلية. يمكنني فقط أن أخمن كيف تم إنشاء الموارد الأصلية ، ودراسة البيانات المؤرشفة والنظر في التنسيقات والملفات القابلة للتنفيذ معبأة في هذه البيانات. يبدو أنه تم إنشاء نماذج ثلاثية الأبعاد في Autodesk 3D Studio Release 3 ، وتم إنشاء الأجزاء المرسومة يدويًا في DeluxePaint Animation v1.0. لا أعرف أيضًا المراحل التي يتكون منها إنشاء بيانات شكل الموجة للصوت ، ولكن كل مقطع صوتي مستخدم (بتنسيق .sad) يحتوي على معلومات حول مستوى الصوت والتحريك حسب الإطارات الرئيسية ، والتي تستخدم لخلط الصوت أثناء اللعبة.


عملية إنشاء FMV الأصلي

بعد إنشاء هذه الأجزاء المنفصلة من الإطار ، تم تنفيذ عملية دمج الإطار. جمعت هذه العملية صورًا ثلاثية الأبعاد للإطارات مع إطارات رسوم متحركة مرسومة يدويًا (جنبًا إلى جنب مع كل شيء آخر) ، مما أدى إلى إنشاء منتج نهائي تستخدمه أداة SMUSHFT (ملفات .nut). بعد أن أصبح المشروع جاهزًا للترميز ، تمت معالجة الفيديو وتم بالفعل تشغيل النتيجة النهائية (.san) في محرك اللعبة.

قام SMUSHFT بتنفيذ الترميز النهائي لتنسيق ملف الفيديو الأصلي (.san) ، وكان لكل ملف فيديو ملف مشروع (.pro) يصف تجميع الفيديو (الصوت والفيديو وموقع الترجمة). أردنا استخراج هذه المعلومات حتى نتمكن من إنشاء ملف مشروع Adobe Premiere Pro واستخدامه لترميز النسخة المحولة من الفيديو بدقة 4K. للقيام بذلك ، كنا بحاجة إلى عكس هندسة ملف مشروع SMUSHFT.

تنسيقات الملفات الهندسية العكسية


من الرائع أن يكون لديك شفرة المصدر ، لأنه يمكنك فقط دراستها وفهم كيفية إنشاء / قراءة ملف المشروع. بدون رمز المصدر ، يجب عليك فتح ملف المشروع في محرر سداسي وتحليل الأنماط داخل الملف. هذه هي بالضبط الطريقة التي استخدمناها لاستخراج محتوى مفيد من ملف مشروع SMUSHFT.

نظرًا لأنه يمكننا تشغيل SMUSHFT الأصلي في DOSBox ، فقد رأينا واجهة مستخدم البرنامج ، والتي أعطتنا تلميحات حول تنسيق الملف. ألق نظرة على لقطة الشاشة هذه لفتح ملف .pro الأصلي:


مشروع SMUSHFT عينة

هنا يمكنك ملاحظة ما يلي: هناك موارد مسماة في الملف (2027.NUT ، 2027.SAD ، IN_06A.NUT ، وما إلى ذلك). من المرجح أن تعرض هذه الموارد المسماة أحرف ASCII داخل الملف. بالإضافة إلى ذلك ، توجد عدادات إطارات في أعلى المخطط الزمني ، وعلى يسار المخطط الزمني ، توجد أرقام طبقة متزايدة. والأخير - يقع كل مورد في المخطط الزمني على رقم إطار معين وله مدة معينة. إذا تمكنا من استخراج هذه المعلومات من ملفات المشروع الأصلية ، فسوف تتيح لنا معرفة مكان وضع موارد جديدة تلقائيًا على مخطط Adobe Premiere Pro الزمني.


مشروع Adobe Premiere Pro النموذجي

من خلال فتح ملف المشروع الأصلي في محرر سداسي ، يمكنك الحصول على بعض المعلومات المفيدة جدًا. انظر إلى المثال أعلاه بالنظام الست عشري:


ملف مشروع SMUSHFT في محرر الهيكس

يمكننا البدء في النظر إلى ملف .pro باستخدام محرر سداسي (أفضل Hexplorer) ومحاولة البحث عن الأنماط. يمكنك بسهولة العثور على الموارد المسماة بتنسيق ASCII بدون بايت في النهاية. يوجد تقريبًا في نفس منطقة الذاكرة مجموعة من القيم المخزنة على شكل شورتات (عدد صحيح مزدوج البايت). مقارنة الأرقام المعروضة في SMUSHFT بـ
تعطينا الأرقام من ملف المشروع بتنسيق سداسي الأساس لتحويل ملف المشروع الأصلي بشكل صحيح إلى محرر فيديو حديث مثل Adobe Premiere Pro.

مجموعة أدوات الأتمتة


كان الجزء الأكبر من سير العمل هذا مؤتمتًا ولا يتطلب تدخلًا بشريًا. أحد أسباب ذلك هو أنه تم نسخ محتويات جميع مقاطع الفيديو بالكامل من الأصل ؛ في الواقع ، كنا نقوم فقط بترقية المحتوى. وبالتالي ، لم تتح لنا عمليا الفرصة لتغيير تنسيق FMV بالكامل. نحن بحاجة فقط لإيجاد طريقة لإعادة إنشاء الفيديو باستخدام موارد عالية الدقة ، مع تقليل الوقت المستغرق في المنتج.

أولاً ، يجب أن أقول أن الخطوة الأولية الجادة قبل أتمتة العملية بأكملها يجب أن تكون محادثة مع فريق من منشئي المحتوى (الرسومات والصوت). والسبب هو أن معظم عمليات الأتمتة تتطلب من منشئي المحتوى الالتزام بمجموعة معينة من القواعد حول إعداد المشاريع ومواقع الملفات والأدوات المستخدمة وما إلى ذلك. في مشروعنا ، كان هذا يعني أنه كان علينا مناقشة أدوات إنشاء محتوى الإطارات المرسومة يدويًا ، والنماذج والأصوات ثلاثية الأبعاد ، ثم محرر فيديو لتجميع كل هذا معًا. كان من الضروري أيضًا الاتفاق على أي أجزاء من سير العمل سيتم إجراؤها يدويًا وأيها سيتم تشغيله تلقائيًا.

ونتيجة لذلك ، قررنا ما يلي:

  • سيتم إنشاء الإطارات المرسومة يدويًا في Adobe Animate بدقة 4440x2400 بكسل.
  • سيتم إنشاء نماذج ورسوم متحركة ثلاثية الأبعاد في Autodesk Maya وعرضها يدويًا ، أيضًا بدقة 4440 × 2400 بكسل
  • سيتم إنشاء ملفات الصوت بتنسيق wav. مع 48 كيلو هرتز ومعلمات 16 بت
  • سيتم إنشاء أجزاء من الفيديو تلقائيًا في البداية ، وسيتمكن الفنان من تغيير أي جزء يحتاجه (مع بعض الاستثناءات)
  • سيتم أتمتة المراحل النهائية من الخياطة والتشفير FMV

استخدمنا عدة طرق لجعل الأدوات آلية قدر الإمكان. تم اختيار Python كـ "الغراء" الذي يربط كل شيء معًا ، لأنه تم توسيعه جيدًا من قبل مكتبات مختلفة ، كما يسهل كتابة التعليمات البرمجية وصيانتها. كما استفدنا من دعمها الداخلي لمعالجة الملفات المستقلة عن النظام الأساسي (النسخ ، النقل ، الحذف).

Python - استدعاء الملفات القابلة للتنفيذ والحصول على النتائج


كانت مكتبة العمليات الفرعية في Python مثالية لنا ، لأنها تتيح لك تغيير تنفيذ الملفات القابلة للتنفيذ الأخرى وحتى الانتظار حتى اكتمال مهامها. يسمح لك بالحصول على الرمز الذي تم إرجاعه بواسطة البرنامج والوصول إلى المخزن المؤقت stdout & stderr.

import subprocess # The command to execute command = 'SanExtract.exe -f -i credits.san -o \"C:/output_dir/\" ' # Execute the command via subprocess child = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # Wait for process to complete, returns stdout & stderr buffers stdout, stderr = child.communicate() # Retrieve the return code from the process return_code = child.returncode 

مثال على التفاعل مع الملفات القابلة للتنفيذ في Python

Python - Win32 API


تعتبر Win32 API مفيدة للغاية لأنها أتاحت لنا الوصول إلى إرسال رسائل لوحة المفاتيح والماوس من Windows من برنامج نصي. على سبيل المثال ، يمكنك إنشاء وظيفة تقوم بالنقر فوق الماوس في إحداثيات س ، ص معينة للشاشة:

 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) 

مثال محاكاة النقر فوق الماوس Python

يمكنك أيضًا إرسال أحداث ضغطات المفاتيح إلى لوحة المفاتيح (مع أو بدون مُعدِّلات):

 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) 

مثال محاكاة لوحة مفاتيح Python

هناك العديد من الاحتمالات الأخرى ، لكن الأمثلة المذكورة أعلاه ساعدت حقًا في تحقيق أهدافنا. يمكنك إرسال أحداث لوحة المفاتيح إلى أي برنامج نشط وسيبدأ في كتابتها ، كما لو أننا ندخل شيئًا من لوحة المفاتيح ، بما في ذلك الضغط على مفاتيح التشغيل السريع.

Python - رؤية الكمبيوتر للنقر فوق الأزرار


كانت التجربة الفريدة هي استخدام برامج رؤية الكمبيوتر في تلك الأدوات التي لا يمكن أتمتتها من خلال النصوص الداخلية. تحتوي معظم الأدوات الحديثة على دعم البرمجة النصية ، ولكنها لا تزال تتطلب تدخل المستخدم. على سبيل المثال ، يسمح لك 3D Studio Max بتشغيل ملفات MAXScript من سطر الأوامر. في حالتنا ، نقوم بتشغيل البرنامج النصي لاستيراد ملف الشبكة ثلاثية الأبعاد تلقائيًا ، وبعد ذلك يبدأ 3D Studio Max تلقائيًا ويعرض مربع الحوار "استيراد الشكل" ، حيث يجب على المستخدم النقر فوق الأزرار:


مربع حوار مثال ، استيراد شكل

لذا - كتبنا نصًا للأتمتة ، والآن علينا أن نجلس أمام الشاشة ، ونضغط على المفاتيح؟ بدلاً من الجلوس على لوحة المفاتيح وانتظار ظهور النافذة المنبثقة ، يمكننا جعل النص يلتقط لقطة شاشة ، واستخدام ربط OpenCV بـ Python للعثور على قالب صورة الزر والنقر عليه تلقائيًا. إليك ما يبدو عليه قالب الصورة في المثال الموضح أعلاه.


قالب صورة ok_button.png

تجدر الإشارة إلى أن قالب الصورة يحتوي على ميزات إضافية (نص لـ "كائن واحد" و "كائنات متعددة"). هذا يسمح لنا بالحصول على نتيجة بحث أكثر حتمية. فيما يلي مثال للنص البرمجي Python المستخدم للنقر تلقائيًا على موقع تم العثور عليه لقالب صورة:

 import cv2 import ImageGrab # "Constants" TEMPLATE_THRESHOLD = 0.25 CLICK_OFFSET = 20 # Read the template image to search for template_image = cv2.imread('images/ok_button.png', 0) # Screenshot the current desktop and load it to a cv2 format screen = ImageGrab.grab() screen.save('screen.png') screen_image = cv2.imread('screen.png', 0) # Search for the template within the screenshot and retrieve search results match_result = cv2.matchTemplate(screen_image, template_image, cv2.TM_SQDIFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(match_result) # If below the threshold, it's likely we know where to click if min_val < TEMPLATE_THRESHOLD: ClickXY(min_loc[0]+CLICK_OFFSET, min_loc[1]+CLICK_OFFSET) 

مثال على النقر على عنصر العرض باستخدام OpenCV ، المكتوب بلغة Python

تستند جميع الأمثلة المذكورة أعلاه إلى Python. ولكن هناك أوقات نحتاج فيها إلى تحكم أكثر دقة في نظام نوافذ نظام التشغيل. أدى هذا بنا إلى تطوير أدوات أصلية باستخدام واجهة برمجة تطبيقات Windows Automation.

Windows Native (C ++) - Windows Automation API


يوفر Windows Automation API الوصول إلى Microsoft Active Accessibility API (MSAA) القديم بالإضافة إلى Microsoft UI Automation API. يمكنك قراءة المزيد عن هذا على صفحة Microsoft .

ونتيجة لذلك ، تمكنا من تقديم طلبات لعناصر معينة من واجهة Windows (الأزرار وحقول النص وعلامات التبويب وعناصر القائمة) ، ومعرفة مكان هذه العناصر مكانيًا على الشاشة ، والنقر / التفاعل معها. تحتوي Windows SDK أيضًا على أدوات اختبار تتيح لك معرفة الخصائص المتوفرة. سمحوا لنا بمعرفة ما يمكن أتمتة في كل برنامج محدد.

يعتبر تطبيق Inspect.exe مفيدًا تمامًا لعرض التسلسل الهرمي لإدارة نافذة البرنامج ؛ يوفر فكرة تقريبية عن مكان وجود عناصر مثل عناصر التحكم في القائمة ، وكيفية الإشارة إلى عناصر النافذة باستخدام مكالمات API التلقائية.


مثال Inspect.exe

بعد أن تتعلم التسلسل الهرمي للتحكم في برنامج Windows ، ستعرف كيفية العثور عليه من مقبض النافذة الرئيسية ومعرفة كيفية النقر على العناصر المختلفة من خلال واجهة برمجة التطبيقات:

 #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); } } } } 

مثال على دفع عنصر تحكم النافذة في C ++

وبالطبع ، فإن تمرير ضغطات المفاتيح على النافذة النشطة أمر بسيط أيضًا:

 #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); } } 

مثال لمحاكاة لوحة المفاتيح C ++

بالطبع ، تحتوي واجهات برمجة التطبيقات هذه على ميزات أكثر بكثير. لقد وجدت أنه بفضل أداة Inspect.exe ، يمكنك إلقاء الضوء على عناصر نافذة البرنامج التي يمكن الوصول إليها.

تنسيقات النص المتوسط


كان جزء من سير العمل لدينا هو حفظ الملفات في شكل نصي وتغيير القيم في هذه الملفات النصية. في النهاية ، تحتوي الأدوات على واجهة مستخدم لتغيير حالة البيانات المساعدة. وإذا كنت تعرف ما يجب أن تكون عليه هذه البيانات الإضافية ، فليس من الضروري العمل باستخدام الأداة ، فقط قم بتغيير البيانات الإضافية. تكمن الحيلة في معرفة كيفية معالجة هذه البيانات الداعمة ؛ عند تغيير تنسيقات الملفات المملوكة ، يمكن أن يكون هذا تحديا. ألن يكون لطيفًا إذا كان لدى الجميع ملف نصي بسيط يمكنك العمل معه؟

تكمن الحيلة في إيجاد طريقة حول تنسيقات الملفات الخاصة التي تستخدمها معظم الأدوات. الحل عادة هو استخدام خيارات الاستيراد والتصدير الموجودة في معظم الأدوات التجارية الحديثة. إليك بعض الأمثلة:

يحفظ Adobe Premiere Pro الملفات بتنسيق خاص ، ولكن يمكنك استيراد / تصدير المشاريع بتنسيق Final Cut Pro XML. بعد التصدير إلى XML ، يمكنك تغيير XML بالطريقة التي نحتاجها وإعادة استيراد المشروع مرة أخرى إلى Adobe Premiere Pro.

مثال آخر هو تصحيح المراجع النسيجية المستخدمة في تنسيق شبكة Autodesk 3D Studio Release 3 3D القديمة. عند استيراد ملف الشبكة الأصلي ، نقوم بحفظ الشبكة المحولة حديثًا في ملف وسيط .fbx باستخدام أحرف ASCII. في هذا التنسيق ، يمكنك معالجة ملف نصي واستبدال جميع خطوط روابط الأنسجة بالأخرى الصحيحة.

Adobe Animate / Flash مضحك للغاية حيث اتضح أن ملفات .fla هي في الواقع ملفات .zip "مكسورة". في شكل غير مضغوط ، يتم تخزينها بتنسيق XFL ، والتي يمكن أن تشير إلى كائنات XFL أخرى (على سبيل المثال ، الصور النقطية) من مجلد محلي. قام المهندس الرئيسي المزدوج في شركة Fine Fine Oliver Franzke بإنشاء نص Python معدّل لحزم / فك ضغط ملفات .fla باستخدام ZIP حتى نتمكن من إنشاء / تعديل هذه الملفات.

أمثلة على الاستخدام


3D ستوديو ماكس


تم استخدام الإصدار الحديث من 3D Studio Max لاستيراد ملف .prj الأصلي إلى المشهد وحفظه بتنسيق ASCII .fbx. لكل ملف .prj الذي يجب تحويله ، تم إنشاء ملف MaxScript (.ms) تلقائيًا من نص Python النصي ، والذي بدا كالتالي:

 importFile "G:\FullThrottle_Backup\FullThrottle_SourceAssets\BENBIKE.PRJ" #noPrompt 

مثال على استيراد نموذج ثلاثي الأبعاد باستخدام MaxScript

بعد ذلك ، تم استدعاء ملف .ms هذا ببساطة بواسطة أمر Python للتشغيل في 3dsmax.exe:

 3dsmax.exe -U MAXScript "C:\FullThrottleRemastered\import_prj.ms" 

مثال على أمر وحدة التحكم لاستدعاء ملف قابل للتنفيذ مع ملف MaxScript المحدد

كما ذكر أعلاه ، في هذه الحالة ، قام 3D Studio Max بفتح مربع حوار كان عليك النقر فوقه. ساعدت حزمة OpenCV مع Python على النقر على الزر في هذه النافذة بحيث يتم استيراد الملف الأصلي دون تدخل المستخدم. بعد استيراد الملف ، تم الضغط على سلسلة من مفاتيح القائمة (باستخدام win32api Python) لتشغيل ملف MAXScript آخر قام بتصدير النموذج كملف .fbx بتنسيق ASCII. نظرًا لأنه تم حفظ .fbx كملف نصي عادي ، تم استبدال جميع تبعيات تبعيات نسيج النموذج بروابط للصور بتنسيق حديث. ثم ، تم تحميل ملف .fbx المعدل مرة أخرى تلقائيًا في 3DSMax وتم تصديره كملف .max. عند هذه النقطة ، يمكن إرسال ملف .max إلى الفنان لإعادة تشكيله.

Adobe Animate / Flash


تم استخدام Adobe Animate / Flash لإعادة إنتاج جميع موارد FMV المرسومة يدويًا. أخذنا الإطارات الأصلية المرسومة يدويًا (بحجم 320 × 200 بكسل) التي عثرت عليها أداة SanWrangler واستخدمتها كـ "رسومات تجميع". تم تكبير مقياس الصورة ليلائم 4440x2400 بكسل ، وبعد ذلك تم إنشاء ملف .fla تلقائيًا باستخدام نص Python النصي.

ثم كان كافيًا إنشاء ملف .fla تلقائيًا من البداية ، وذلك باستخدام معرفتنا بتنسيق XFL Adobe Animate / Flash. تمكنا من استخدام مجموعة الأدوات التي تم إنشاؤها بالفعل بواسطة Oliver Franzke لإنشاء رسومات التجميع لملفات الرسوم المتحركة المرسومة يدويًا.

Adobe Premiere Pro


ساعدنا Windows Automation API حقًا في تحديد عناصر تحكم Premiere Pro التي تظهر على الشاشة. في بعض الحالات ، لم يكن لديهم مفاتيح الاختصار. بعد تلقي إحداثيات عناصر القائمة ، كان من الضروري تحريك المؤشر إلى هذه الإحداثيات وإرسال حدث النقر بالماوس.

كل هذا رائع ، ولكن يتم تقديم بعض عناصر التحكم بطرق أخرى ، وبالتالي فهي غير مرئية لـ Windows Automation API. لهذه الحالة ، قررنا استخدام مجموعة من OpenCV و Python حتى نتمكن من استخدام OpenCV في بيئة البرمجة النصية. كان هذا مفيدًا بشكل خاص عند العمل مع Adobe Premiere Pro: على الرغم من أنه يحتوي على دعم جزئي لنصوص JavaScript ، إلا أن نوع التحكم المطلوب لم يكن متاحًا من خلال واجهة برمجة التطبيقات.

بالإضافة إلى ذلك ، يتم تخزين ملفات مشروع Adobe Premiere Pro بتنسيق ثنائي مملوك. لذلك ، لم نتمكن فقط من إنشاء ملف Premiere Pro بطريقة سحرية ، ولكن يمكننا استخدام وظيفة الاستيراد ، والتي سمحت لنا باستيراد البيانات إلى ملف Final Cut Pro ، الذي يحتوي على تنسيق XML. ثم كان كافيًا إنشاء ملف XML الصحيح ، ووضع جميع الموارد بشكل مناسب في المخطط الزمني ، ثم استيراد ملف .xml Final Cut Pro تلقائيًا لتحويله إلى التنسيق المطلوب. ثم يمكننا وضع الإطارات المصدرة في قائمة انتظار آلية حتى نتمكن من دمجها في فيديو منتهي.

جميع المراحل


فيما يلي رسم تخطيطي عام يُظهر جميع الأجزاء التلقائية لسير العمل الجديد. يُحاط كل مقطع آلي بمستطيل دائري بمعلومات إضافية حول تقنيات الأتمتة المستخدمة.


مخطط انسيابي لأتمتة FMV معاد تبسيطه

ستلاحظ أن معظم العمل مع Adobe Premiere Pro يتطلب استخدام Python ، بالإضافة إلى رمز Windows الأصلي المتخصص. السبب هو البنية المعقدة لنوافذ Premiere Pro ، بالإضافة إلى الحاجة إلى استخدام Windows Automation API الأصلي لضمان التفاعل المناسب مع جميع النوافذ التابعة التابعة لهذا التطبيق.

معًا


باستخدام الطرق الموضحة أعلاه ، تمكنا من تكوين العديد من آلات الأتمتة لتقسيم العمل على جميع مقاطع الفيديو إلى أجزاء. أيضًا ، تم دمج Slack Bot في سير العمل لإرسال تعليقات حول الأتمتة إلى قناة Slack الخاصة بنا وفقًا لحالة مقاطع الفيديو التي تمر عبر خط المعالجة ، حتى نعرف عندما يحدث خطأ ما.


مثال على Adobe Premiere Pro Automation

المشاكل التي نواجهها


كل هذا يبدو رائعًا ، ولكن في الواقع ، عند تنفيذ المشروع ، واجهنا مشاكل. سأذكر فقط النقاط الرئيسية.

1) تكرار خلط الصوت النهائي. تم إعادة رسم جميع الملفات الصوتية تدريجيا. لذلك ، عندما كان لدينا ، على سبيل المثال ، المؤثر الصوتي "BOOM!" ، لم يكن لدى مهندس الصوت أي فكرة عن مكان إدخاله في المزيج الصوتي ، لذلك كان عليه الانتظار حتى يتم ترميز الفيديو لمعرفة الخطأ الذي حدث.

2) تخزين الملفات الوسيطة غير المضغوطة. تم تخزين الإطارات بتنسيق غير مضغوط حتى آخر لحظة من التشفير في الفيديو النهائي. لذلك ، كان من الضروري تخزين عدد كبير من الإطارات في التخزين المحلي ، وبعضها تم تخزينه في نظام التحكم في الإصدار. كانت هذه الزيادة في الحجم المخزن ملحوظة للغاية ويمكن أن تكون مكلفة للغاية عند استخدام بعض أنظمة التحكم في الإصدار (استخدمنا Perforce).

3) مهلة. تم أتمتة جزء صلب من سير العمل ، مما سمح للمهندسين بفعل أشياء أخرى. ومع ذلك ، يمكن أن يكون الوقت المستغرق لإنشاء مقطع فيديو واحد طويلًا جدًا. الجزء الأكثر استهلاكًا للوقت هو تشفير الإطارات بدقة 4K. كانت لدينا طرق للتحقق من حالة الموارد داخل Perforce لفهم الخطوات التي يجب القيام بها من جديد ، ولكن لم يتم تقسيم هذه الطريقة إلى أجزاء كما نود.

الخطوات التالية


نعم ، تبين أن المقال ضخم! على الرغم من أن تنفيذنا لسير العمل هذا خاص بالمشروع ، إلا أنني أعتقد أنه يمكن استخدام طرق أتمتة معينة في تطوير أي لعبة. بعد اكتشاف الفيديو ، يمكنك التفكير في موضوع ذي صلة - تشغيل FMV أثناء تنفيذ اللعبة. يتضمن هذا مشكلات مثل ترميز دفق صوتي متعدد اللغات ، بالإضافة إلى مزامنة الإطار عند تشغيل FMV الأصلي. انتظر الجزء الثالث من المقال!

Source: https://habr.com/ru/post/ar422367/


All Articles