Yüzey modunda medya geliştirme yaşam döngüsünü anlama

Media Enhancement API, donanım hızlandırmadan yararlanarak yüksek kaliteli medya iyileştirmeleri sunan, düşük gecikmeli, gizliliği korumaya yönelik ve cihaz üzerinde çalışan bir yapay zeka çözümü sağlar. Bu çözüm, APK boyutunu artırmaz. Daha fazla bilgi için Medya geliştirme özelliklerini anlama başlıklı makaleyi inceleyin.

Aşağıdaki mimari diyagramında, Media Enhancement API'nin eşzamansız yüzey modu yürütme yaşam döngüsü gösterilmektedir. Bu mod, donanım arabelleklerini doğrudan bağlayarak sıkıştırılmamış karelerin CPU ve GPU bellek arabellekleri arasında kopyalanmasıyla oluşan performans darboğazını ortadan kaldırır.

Medya Geliştirme API'sinin 7 adımlı eşzamansız yüzeyden yüzeye yaşam döngüsünü gösteren diyagram.
Şekil 1. Eşzamansız yüzey modu yürütme yaşam döngüsü ve geliştirme ardışık düzeninin yedi uygulanabilir adımı.

Geliştirme ardışık düzeni aşağıdaki adımlar aracılığıyla uygulanır:

1. Aşama: Geliştirme oturumunu ayarlama

1. Giriş yüzeyi sağlama: Uygulamanız, işleme için çerçevelere erişmek üzere giriş yüzeyi tutma yeriyle geliştirme çerçevesini sağlar.

2. Çıkış yüzeyini ayarlama: Uygulamanız, oluşturma hedeflerini (ör. SurfaceView veya TextureView) doğrudan çerçeveye sağlar ve bağlar.

2. Aşama: Giriş karesi oluşturma

3. Temel medyayı hazırlama: Uygulamanız, temel sıkıştırılmamış medyayı alır. Örneğin, yerel bir diskten dosya okuyarak.

4. Kare verilerini yerleştirme: Uygulamanız, ham görüntü yükünü doğrudan bağlı giriş yüzeyi ardışık düzenine yazar.

3. Aşama: İşleme ve iyileştirme

5. Yapay zeka işleme: Çerçeve, cihazın GPU'sunda veya NPU'sunda işlenir. Ton eşleme, bulanıklık giderme veya ölçek büyütme gibi makine öğrenimi geliştirmeleri uygulanır.

6. Gelişmiş kare yayınlama: Motor, geliştirilmiş ve tam çözünürlüklü kareyi doğrudan bağlı çıkış yüzeyine verir.

4. Aşama: Sonucu görüntüleme veya kaydetme

7. Çıkışı sonlandırma: Uygulamanız, işlenmiş donanım akışı arabelleğini kullanıcı arayüzünde oluşturmak veya depolama alanına geri kaydetmek için alır.

EnhancementSession, kalıcı bir GPU veya NPU bellek hattını koruyan ağır bir bağlam nesnesidir. Özel video RAM'i (VRAM) ve yerel sistem işleyicilerini ayırır. Ciddi bellek sızıntılarını ve olası OutOfMemoryError kilitlenmelerini önlemek için aşağıdaki yaşam döngüsü ilkelerine uyun:

  • Geç oluşturma: Kullanıcı bir geliştirme işlemi başlatana kadar oturum oluşturmayın.
  • Stratejik yeniden kullanım: Aynı yapılandırmalara (boyutlar ve etkinleştirilen seçenekler) sahip akışları veya kareleri işlerken tek bir oturum örneğini koruyun ve yeniden kullanın.
  • İstem ayrıştırma: Paylaşılan donanım kaynaklarını boşaltmak için görsel görevler sonlandırıldığında session.release() hemen çağrılır.

Geliştirme motorunu başlatma

Bu yöntem, iki adımlı bir kontrol gerçekleştirir. Cihazın donanımının hızlandırmayı destekleyip desteklemediğini doğrular ve ardından gerekli makine öğrenimi modüllerinin mevcut olduğundan emin olur.

Bu işlemi ön koşul adımı olarak çalıştırmak, uygulamanız medyayı işlemeye çalışmadan önce özellikleri doğrulayarak çalışma zamanı başlatma hatalarını önler.

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

Uygulama: Yüzey modu (yüzeyde, yüzeyin dışında)

Yüzey yürütme modu (EnhancementMode.SURFACE), karelerin CPU ile GPU bellek arabellekleri arasında taşınmasıyla ilgili performans ek yükünü önler. Bunun yerine, geliştirme kitaplığı ham donanım arabelleklerini doğrudan eşler. Giriş yüzeyinden kareleri okur, bunları yerel olarak işler ve doğrudan bir çıkış yüzeyine aktarır.

Tek kare yüzey anlık görüntüleri

Bu yöntem, efektleri donanım tarafından çözülen tek bir resim karesine verimli bir şekilde uygulamak için kullanılır.

// 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()