چرخه عمر بهبود رسانه در حالت Surface را درک کنید

رابط برنامه‌نویسی کاربردی بهبود رسانه (Media Enhancement API) یک راهکار هوش مصنوعی با تأخیر کم و حفظ حریم خصوصی روی دستگاه ارائه می‌دهد که از شتاب سخت‌افزاری برای ارائه بهبودهای رسانه‌ای با کیفیت بالا و بدون حجم زیاد APK استفاده می‌کند. برای اطلاعات بیشتر، به درک قابلیت‌های بهبود رسانه مراجعه کنید.

نمودار معماری زیر چرخه حیات اجرای حالت سطحی ناهمزمان رابط برنامه‌نویسی کاربردی بهبود رسانه (Media Enhancement API) را نشان می‌دهد. این حالت مستقیماً بافرهای سخت‌افزاری را به هم متصل می‌کند تا گلوگاه عملکرد کپی کردن فریم‌های فشرده نشده بین بافرهای حافظه CPU و GPU را از بین ببرد.

نموداری که چرخه حیات ناهمزمان سطح به سطح 7 مرحله‌ای رابط برنامه‌نویسی کاربردی بهبود رسانه (Media Enhancement API) را نشان می‌دهد.
شکل ۱. چرخه حیات اجرای حالت سطحی ناهمزمان و هفت مرحله عملی خط لوله بهبود.

خط لوله بهبود از طریق مراحل زیر اجرا می‌شود:

مرحله ۱. جلسه بهبود را تنظیم کنید

۱. ارائه سطح ورودی : برنامه شما چارچوب بهبود را با یک دسته سطح ورودی برای دسترسی به فریم‌ها جهت پردازش فراهم می‌کند.

۲. تنظیم سطح خروجی : برنامه شما اهداف رندرینگ (مانند SurfaceView یا TextureView ) را مستقیماً به فریم‌ورک متصل و آماده می‌کند.

مرحله ۲. تولید یک فریم ورودی

۳. آماده‌سازی رسانه پایه : برنامه شما رسانه فشرده نشده پایه را بازیابی می‌کند. برای مثال، با خواندن یک فایل از یک دیسک محلی.

۴. تزریق داده‌های فریم : برنامه شما تصویر خام را مستقیماً در خط لوله سطح ورودی محدود می‌نویسد.

مرحله ۳. پردازش و بهبود

۵. اجرای پردازش هوش مصنوعی : این چارچوب، فریم را روی GPU یا NPU دستگاه پردازش می‌کند و از بهبودهای یادگیری ماشینی مانند نگاشت تُن، رفع تاری یا افزایش مقیاس استفاده می‌کند.

۶. ارائه فریم بهبود یافته : موتور، فریم بهبود یافته و با وضوح کامل را مستقیماً به سطح خروجی مقید شده ارسال می‌کند.

مرحله ۴. نمایش یا ذخیره نتیجه

۷. نهایی کردن خروجی : برنامه شما بافر جریان سخت‌افزاری پردازش‌شده را دریافت می‌کند تا آن را در رابط کاربری رندر کند یا دوباره در حافظه ذخیره کند.

EnhancementSession یک شیء context سنگین است که یک خط لوله حافظه GPU یا NPU پایدار را حفظ می‌کند. این شیء، RAM ویدیویی اختصاصی (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 ) از سربار عملکرد ناشی از جابجایی فریم‌ها بین بافرهای حافظه CPU و GPU جلوگیری می‌کند. در عوض، کتابخانه Enhancement مستقیماً بافرهای سخت‌افزاری خام را نگاشت می‌کند، فریم‌ها را از یک 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()