Premiers pas avec les API d'amélioration des contenus multimédias

L'API Media Enhancement est un outil puissant qui utilise l'accélération GPU sur l'appareil pour améliorer les images de haute qualité et à faible latence. Cela inclut des fonctionnalités telles que le mappage des tons automatique, la réduction du flou, la réduction du bruit et la mise à l'échelle.

Avant d'initialiser l'API, vous devez configurer les dépendances de votre projet et déclarer les exigences d'accélération matérielle dans votre fichier manifeste. Ignorer ces configurations est la principale cause d'erreurs d'exécution GLOBAL_INIT_FAILED.

Dépendances Gradle

Ajoutez les dépendances suivantes à votre fichier app/build.gradle.kts. Pour faciliter l'exécution asynchrone et non bloquante, incluez les coroutines Kotlin et Jetpack Media3 pour la gestion des surfaces matérielles.

dependencies {
    // Google Play services Media Enhancement Library (Beta)
    implementation("com.google.android.gms:play-services-media-effect-enhancement:16.0.0-beta04")
}

Consultez les détails du package play-services-media-effect-enhancement dans le dépôt Maven de Google.

Nous vous recommandons également d'utiliser les coroutines Kotlin pour gérer les sessions d'amélioration de manière asynchrone.

// Kotlin coroutines for asynchronous API handling
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.7.3")

Exigences concernant le fichier manifeste Android

Ajoutez les éléments suivants dans la balise <application> de votre fichier AndroidManifest.xml :

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <!-- 1. Google Play services version for runtime compatibility checks -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <!-- 2. Declare OpenCL compute libraries for NPU/GPU neural acceleration -->
        <uses-native-library android:name="libOpenCL.so" android:required="false" />
        <uses-native-library android:name="libOpenCL-car.so" android:required="false" />
        <uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />
        <!-- 3. Declare OpenGL ES for high-performance graphics rendering -->
        <uses-native-library android:name="libGLESv2.so" android:required="false" />
        <uses-native-library android:name="libGLESv3.so" android:required="false" />
    </application>
</manifest>

OpenCL fournit les bibliothèques de calcul natives requises pour activer l'accélération neuronale du NPU et du GPU pour les tâches d'amélioration des contenus multimédias. La déclaration de ces bibliothèques dans votre fichier manifeste est une condition préalable pour que l'API puisse tirer parti de l'accélération matérielle, qui est essentielle pour effectuer des améliorations de haute qualité et à faible latence. Pour en savoir plus sur OpenCL, consultez Implémentations OpenCL.

OpenGL ES fournit les bibliothèques graphiques natives requises pour le rendu hautes performances des sorties d'amélioration multimédia. Il est essentiel de déclarer ces bibliothèques dans votre fichier manifeste pour que le pipeline de rendu puisse afficher efficacement les contenus multimédias traités sur des surfaces à accélération matérielle. Pour en savoir plus sur OpenGL, consultez la présentation de la documentation de l'API OpenGL.

Le pipeline de rendu Android doit être accéléré par le matériel pour éviter les goulots d'étranglement. Bien qu'il soit activé par défaut pour les applications ciblant l'API 14 et versions ultérieures, définissez explicitement android:hardwareAccelerated="true" dans vos balises <activity>.

Compatibilité avec les appareils et configuration du module

Les services Google Play fournissent des modèles de machine learning de manière dynamique pour préserver l'espace de stockage de votre APK initial. Avant d'effectuer des améliorations, l'application doit utiliser EnhancementClient pour vérifier la compatibilité matérielle et s'assurer que les pondérations de modèle nécessaires sont téléchargées et mises en cache localement. Cette procédure est effectuée une seule fois par appareil.

À l'aide de suspendCancellableCoroutine, vous pouvez encapsuler les rappels de client basés sur des tâches dans des fonctions de suspension Kotlin standards pour une exécution séquentielle plus propre :

// Verifies if host hardware supports NPU/GPU acceleration
suspend fun EnhancementClient.isDeviceSupportedAsync(): Boolean = suspendCancellableCoroutine { continuation ->
    this.isDeviceSupported()
        .addOnSuccessListener { result -> continuation.resume(result) }
        .addOnFailureListener { exception -> continuation.resumeWithException(exception) }
}
// Verifies the presence of required neural network models
suspend fun EnhancementClient.isModuleInstalledAsync(): Boolean = suspendCancellableCoroutine { continuation ->
    this.isModuleInstalled()
        .addOnSuccessListener { result -> continuation.resume(result) }
        .addOnFailureListener { exception -> continuation.resumeWithException(exception) }
}