فهم دورة حياة تحسين الوسائط في "وضع Surface"

توفّر Media Enhancement API حلاً منخفض وقت الاستجابة ومحافظًا على الخصوصية ومستندًا إلى الذكاء الاصطناعي على الجهاز فقط، ويستفيد من تسريع الأجهزة لتقديم تحسينات عالية الجودة على الوسائط بدون أي تضخّم في حِزم APK. لمزيد من المعلومات، يُرجى الاطّلاع على التعرّف على إمكانات تحسين الوسائط.

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

مخطّط يوضّح دورة الحياة غير المتزامنة من 7 خطوات لواجهة برمجة التطبيقات Media Enhancement API من سطح إلى سطح
الشكل 1. دورة حياة تنفيذ وضع مساحة العرض غير المتزامن والخطوات السبع القابلة للتنفيذ في مسار التحسين

يتم تنفيذ مسار التحسين من خلال الخطوات التالية:

المرحلة 1: إعداد جلسة التحسين

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

2. ضبط مساحة العرض: يوفّر تطبيقك أهداف العرض ويربطها (مثل SurfaceView أو TextureView) مباشرةً بالإطار.

المرحلة 2: إنشاء إطار إدخال

3- إعداد الوسائط الأساسية: يسترد تطبيقك الوسائط الأساسية غير المضغوطة. على سبيل المثال، من خلال قراءة ملف من قرص محلي.

4. إدخال بيانات الإطار: يكتب تطبيقك حمولة الصورة الأولية مباشرةً في مسار سطح الإدخال المرتبط.

المرحلة 3: المعالجة والتحسين

5. تنفيذ معالجة الذكاء الاصطناعي: يعالج إطار العمل اللقطة على وحدة معالجة الرسومات (GPU) أو وحدة المعالجة العصبية (NPU) في الجهاز، ويطبّق تحسينات تعلُّم الآلة، مثل ربط الدرجات اللونية أو إزالة التشويش أو تحسين الدقة.

6. عرض إطار محسّن: يعرض المحرّك الإطار المحسّن بكامل دقته مباشرةً على مساحة العرض المرتبطة.

المرحلة 4: عرض النتيجة أو حفظها

7. إنهاء الإخراج: يتلقّى تطبيقك المخزن المؤقت لتدفق الأجهزة الذي تمت معالجته لعرضه في واجهة المستخدم أو حفظه مرة أخرى في وحدة التخزين.

EnhancementSession هو عنصر سياق كبير الحجم يحافظ على مسار ذاكرة مستمر لوحدة معالجة الرسومات أو وحدة المعالجة العصبية. ويخصّص ذاكرة وصول عشوائي للفيديو (VRAM) ومقابض نظام أصلية. لتجنُّب حدوث تسرُّبات كبيرة في الذاكرة وتعطُّل محتمل في OutOfMemoryError، يجب الالتزام بمبادئ دورة الحياة التالية:

  • التنفيذ عند الطلب: لا تنشئ جلسة إلا بعد أن يتّخذ المستخدِم إجراءً لتحسين الأداء.
  • إعادة الاستخدام الاستراتيجي: احتفِظ بنسخة واحدة من الجلسة وأعِد استخدامها عند معالجة أحداث البث أو اللقطات التي تتضمّن إعدادات متطابقة (الأبعاد والخيارات التي تم تفعيلها).
  • إيقاف الطلب: استدعِ session.release() فور انتهاء المهام المرئية لتحرير موارد الأجهزة المشتركة.

تهيئة محرّك التحسين

تنسّق هذه الطريقة عملية تحقّق من خطوتين. يتحقّق هذا الإعداد مما إذا كانت أجهزة الجهاز متوافقة مع ميزة التسريع، ثم يتأكّد من توفّر وحدات تعلُّم الآلة المطلوبة.

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

class MediaSetupViewModel(application: Application) : AndroidViewModel(application) {
    private val enhancementClient = Enhancement.getClient(application)
    fun initializeEnhancementEngine() {
        viewModelScope.launch {
            try {
                // 1. Verify hardware capability
                val isSupported = enhancementClient.isDeviceSupportedAsync()
                if (!isSupported) {
                    notifyUiDeviceIncompatible()
                    return@launch
                }
                // 2. Verify and download the Google Play services ML modules
                val isInstalled = enhancementClient.isModuleInstalledAsync()
                if (!isInstalled) {
                    notifyUiDownloadingModels()
                    enhancementClient.installModule().await()
                }
                notifyUiEngineReady()
            } catch (e: Exception) {
                // Handle potential errors during session creation or image
                // processing.
                handleInitializationError(e)
            }
        }
    }
}

التنفيذ: وضع العرض (العرض في الداخل، العرض في الخارج)

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

لقطات سطحية بإطار واحد

تُستخدَم هذه الطريقة لتطبيق التأثيرات بكفاءة على إطار صورة واحد تم فك ترميزه باستخدام الأجهزة.

// Provisions input Surface (for example, ImageReader) and output Surface (for
// example, SurfaceView)
val inputSurface: Surface = imageReader.surface
val outputSurface: Surface = surfaceView.holder.surface
// 1. Configure parameters for SURFACE mode
val surfaceOptions = EnhancementOptions(
    imageReader.width,
    imageReader.height,
    EnhancementMode.SURFACE,
    enableTonemap = true,
    enableDeblurDenoise = true,
    enableFaceDetection = false
).also {
    // 2. Bind hardware surfaces
    it.setInputSurface(inputSurface)
    it.setOutputSurface(outputSurface)
}

// 3. Create the session to process the hardware frame
val singleFrameSession = enhancementClient.createSessionAsync(surfaceOptions, executor)
// The API processes the single frame. Upon completion, release the session.
singleFrameSession.release()