Korzystanie z interfejsów Media Enhancement API

Media Enhancement API to zaawansowane narzędzie, które wykorzystuje akcelerację GPU na urządzeniu do wykonywania wysokiej jakości ulepszeń obrazu z niskim czasem oczekiwania. Obejmuje to funkcje takie jak automatyczne mapowanie tonów, usuwanie rozmycia, usuwanie szumów i skalowanie w górę.

Zanim zainicjujesz interfejs API, musisz skonfigurować zależności projektu i zadeklarować w pliku manifestu wymagania dotyczące akceleracji sprzętowej. Pomijanie tych konfiguracji jest główną przyczyną GLOBAL_INIT_FAILED błędów w czasie działania.

Zależności Gradle

Dodaj do pliku app/build.gradle.kts te zależności. Aby ułatwić asynchroniczne, nieblokujące wykonywanie, użyj korutyn Kotlin i Jetpack Media3 do obsługi powierzchni sprzętowej.

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

Szczegóły pakietu play-services-media-effect-enhancement znajdziesz w repozytorium Maven Google.

Zalecamy też używanie korutyn Kotlin do asynchronicznego zarządzania sesjami ulepszania.

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

Wymagania dotyczące pliku manifestu Androida

Dodaj te elementy w tagu <application> w pliku 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 udostępnia natywne biblioteki obliczeniowe wymagane do włączenia akceleracji neuronowej NPU i GPU na potrzeby zadań związanych z ulepszaniem multimediów. Zadeklarowanie tych bibliotek w pliku manifestu jest warunkiem wstępnym, aby interfejs API mógł korzystać z akceleracji sprzętowej, która jest niezbędna do przeprowadzania wysokiej jakości ulepszeń o niskim opóźnieniu. Więcej informacji o OpenCL znajdziesz w artykule Implementacje OpenCL.

OpenGL ES udostępnia natywne biblioteki graficzne wymagane do renderowania z wysoką wydajnością danych wyjściowych ulepszania multimediów. Zadeklarowanie tych bibliotek w pliku manifestu jest niezbędne, aby potok renderowania mógł skutecznie wyświetlać przetworzone multimedia na powierzchniach z akceleracją sprzętową. Informacje o OpenGL znajdziesz w omówieniu dokumentacji API OpenGL.

Potok renderowania na Androidzie musi być akcelerowany sprzętowo, aby zapobiec wąskim gardłom. Domyślnie jest włączony w przypadku aplikacji kierowanych na interfejs API w wersji 14 lub nowszej. Musisz go jednak wyraźnie ustawić w tagach android:hardwareAccelerated="true" w ramach tagów <activity>.

Zgodność urządzenia i konfiguracja modułu

Usługi Google Play dynamicznie dostarczają modele uczenia maszynowego, aby oszczędzać miejsce na początkowym pliku APK. Przed zastosowaniem ulepszeń aplikacja musi użyć interfejsu EnhancementClient, aby sprawdzić obsługę sprzętu i upewnić się, że niezbędne wagi modelu zostały pobrane i zapisane w pamięci podręcznej lokalnie. Jest to jednorazowy proces dla każdego urządzenia.

Za pomocą suspendCancellableCoroutine możesz opakować wywołania zwrotne klienta opartego na zadaniach w standardowe funkcje zawieszające Kotlin, aby uzyskać czystsze, sekwencyjne wykonanie:

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