L'API Media Enhancement fournit une solution d'IA sur l'appareil à faible latence et protégeant la confidentialité, qui utilise l'accélération matérielle pour améliorer la qualité des contenus multimédias sans augmenter la taille de l'APK. Pour en savoir plus, consultez Comprendre les fonctionnalités d'amélioration des contenus multimédias.
Le diagramme de l'architecture suivant illustre le cycle de vie de l'exécution du mode Surface asynchrone de l'API Media Enhancement. Ce mode relie directement les tampons matériels pour éliminer le goulot d'étranglement des performances lié à la copie des frames non compressés entre les tampons de mémoire du processeur et du GPU.
Le pipeline d'amélioration est implémenté en suivant les étapes suivantes :
Phase 1 : Configurer la session d'amélioration
1. Fournir une surface d'entrée : votre application fournit au framework d'amélioration un handle de surface d'entrée pour accéder aux frames à traiter.
2. Définir la surface de sortie : votre application provisionne et lie les cibles de rendu (telles que SurfaceView ou TextureView) directement au framework.
Phase 2 : Produire un frame d'entrée
3. Préparez le média de base : votre application récupère le média de base non compressé. Par exemple, en lisant un fichier à partir d'un disque local.
4. Injecter des données de frame : votre application écrit la charge utile d'image brute directement dans le pipeline de surface d'entrée lié.
Phase 3 : Traiter et améliorer
5. Exécuter le traitement par IA : le framework traite le frame sur le GPU ou la NPU de l'appareil, en appliquant des améliorations de machine learning telles que la cartographie tonale, le défloutage ou l'upscaling.
6. Fournir un frame amélioré : le moteur génère le frame amélioré en pleine résolution directement sur la surface de sortie liée.
Phase 4 : Afficher ou enregistrer le résultat
7. Finaliser la sortie : votre application reçoit le tampon de flux matériel traité pour l'afficher dans l'UI ou l'enregistrer dans l'espace de stockage.
EnhancementSession est un objet de contexte lourd qui maintient un pipeline de mémoire GPU ou NPU persistant. Il alloue de la mémoire vive vidéo (VRAM) dédiée et des handles système natifs. Pour éviter les fuites de mémoire graves et les plantages potentiels de OutOfMemoryError, respectez les principes de cycle de vie suivants :
- Instanciation différée : ne créez pas de session tant que l'utilisateur n'a pas lancé d'action d'amélioration.
- Réutilisation stratégique : conservez et réutilisez une seule instance de session lorsque vous traitez des flux ou des frames avec des configurations identiques (dimensions et options activées).
- Analyse des requêtes : invoquez
session.release()immédiatement lorsque les tâches visuelles se terminent pour libérer les ressources matérielles partagées.
Initialiser le moteur d'amélioration
Cette méthode orchestre une vérification en deux étapes. Il vérifie si le matériel de l'appareil est compatible avec l'accélération, puis s'assure que les modules de machine learning requis sont présents.
L'exécution de cette étape en tant que prérequis permet d'éviter les échecs d'initialisation de l'exécution en validant les capacités avant que votre application ne tente de traiter des contenus multimédias.
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)
}
}
}
}
Implémentation : mode Surface (surface d'entrée, surface de sortie)
Le mode d'exécution de surface (EnhancementMode.SURFACE) évite la surcharge de performances liée au déplacement des frames entre les tampons de mémoire du CPU et du GPU. À la place, la bibliothèque d'amélioration mappe directement les tampons matériels bruts, lit les frames à partir d'une surface d'entrée, les traite de manière native et les transmet directement à une surface de sortie.
Instantanés de surface à un seul frame
Cette méthode permet d'appliquer efficacement des effets à un seul frame d'image décodé par le matériel.
// 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()