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