L'API Media Enhancement fornisce una soluzione di AI a bassa latenza, che tutela la privacy e viene eseguita sul dispositivo. Sfrutta l'accelerazione hardware per offrire miglioramenti multimediali di alta qualità senza appesantire l'APK. Per saperne di più, consulta Informazioni sulle funzionalità di miglioramento dei contenuti multimediali.
Il seguente diagramma dell'architettura mostra il ciclo di vita dell'esecuzione della modalità di superficie asincrona dell'API Media Enhancement. Questa modalità collega direttamente i buffer hardware per eliminare il collo di bottiglia delle prestazioni dovuto alla copia di frame non compressi tra i buffer di memoria della CPU e della GPU.
La pipeline di miglioramento viene implementata seguendo questi passaggi:
Fase 1. Configurare la sessione di miglioramento
1. Fornisci una superficie di input: la tua app fornisce al framework di miglioramento un handle della superficie di input per accedere ai frame per l'elaborazione.
2. Imposta la superficie di output: la tua app esegue il provisioning e associa le destinazioni di rendering
(ad esempio un SurfaceView o un TextureView) direttamente al framework.
Fase 2. Produci un frame di input
3. Prepara i contenuti multimediali di base: la tua app recupera i contenuti multimediali di base non compressi. Ad esempio, leggendo un file da un disco locale.
4. Inserisci dati del frame: la tua app scrive il payload dell'immagine non elaborata direttamente nella pipeline della superficie di input associata.
Fase 3. Elabora e migliora
5. Esegui l'elaborazione con l'AI: il framework elabora il frame sulla GPU o sulla NPU del dispositivo, applicando miglioramenti di machine learning come la mappatura della tonalità, la rimozione della sfocatura o l'aumento della risoluzione.
6. Fornisci frame migliorato: il motore restituisce il frame migliorato a risoluzione completa direttamente alla superficie di output associata.
Fase 4. Visualizzare o salvare il risultato
7. Finalizza output: la tua app riceve il buffer del flusso hardware elaborato per visualizzarlo nella UI o salvarlo di nuovo nell'archivio.
EnhancementSession è un oggetto di contesto pesante che mantiene una
pipeline di memoria GPU o NPU persistente. Alloca RAM video (VRAM) dedicata
e handle di sistema nativi. Per evitare gravi perdite di memoria e potenziali
OutOfMemoryError arresti anomali, rispetta i seguenti principi del ciclo di vita:
- Istanziazione differita: non creare una sessione finché l'utente non avvia un'azione di miglioramento.
- Riutilizzo strategico: mantieni e riutilizza una singola istanza di sessione durante l'elaborazione di stream o frame con configurazioni identiche (dimensioni e opzioni attivate/disattivate).
- Smontaggio del prompt: richiama
session.release()immediatamente quando le attività visive terminano per liberare le risorse hardware condivise.
Inizializzare il motore di miglioramento
Questo metodo orchestra un controllo in due passaggi. Verifica se l'hardware del dispositivo supporta l'accelerazione e poi si assicura che siano presenti i moduli di machine learning richiesti.
L'esecuzione di questo passaggio preliminare impedisce errori di inizializzazione in fase di runtime convalidando le funzionalità prima che l'app tenti di elaborare i contenuti multimediali.
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)
}
}
}
}
Implementazione: modalità di superficie (superficie in entrata, superficie in uscita)
La modalità di esecuzione di Surface (EnhancementMode.SURFACE) evita l'overhead
delle prestazioni dovuto allo spostamento dei frame tra i buffer di memoria della CPU e della GPU. Invece, la
libreria di miglioramento mappa direttamente i buffer hardware non elaborati, leggendo i frame da una
Surface di input, elaborandoli in modo nativo e inviandoli direttamente a una
Surface di output.
Snapshot della superficie a singolo fotogramma
Questo metodo viene utilizzato per applicare in modo efficiente gli effetti a un singolo frame dell'immagine decodificata dall'hardware.
// 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()