Media Enhancement API เป็นเครื่องมือที่มีประสิทธิภาพซึ่งใช้การเร่ง GPU ในอุปกรณ์เพื่อปรับปรุงรูปภาพคุณภาพสูงที่มีเวลาในการตอบสนองต่ำ ซึ่งรวมถึงฟีเจอร์ต่างๆ เช่น การแมปโทนสีอัตโนมัติ การลดความเบลอ การลดสัญญาณรบกวน และการเพิ่มขนาด
คุณต้องกำหนดค่าทรัพยากร Dependency ของโปรเจ็กต์และประกาศข้อกำหนดการเร่งฮาร์ดแวร์ในไฟล์ Manifest ก่อนที่จะเริ่มต้น API การข้ามการกำหนดค่าเหล่านี้เป็นสาเหตุหลักที่ทำให้เกิดข้อผิดพลาดรันไทม์ GLOBAL_INIT_FAILED
ทรัพยากร Dependency ของ Gradle
เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในไฟล์ app/build.gradle.kts รวมโครูทีนของ Kotlin และ Jetpack Media3 สำหรับการจัดการพื้นผิวฮาร์ดแวร์เพื่ออำนวยความสะดวกในการดำเนินการแบบอะซิงโครนัสที่ไม่บล็อก
dependencies {
// Google Play services Media Enhancement Library (Beta)
implementation("com.google.android.gms:play-services-media-effect-enhancement:16.0.0-beta04")
}
ดูรายละเอียดแพ็กเกจสำหรับ play-services-media-effect-enhancement ใน
ที่เก็บ Maven ของ Google
นอกจากนี้ เรายังแนะนำให้ใช้โครูทีนของ Kotlin เพื่อจัดการเซสชันการปรับปรุงแบบอะซิงโครนัส
// 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")
ข้อกำหนดของไฟล์ Manifest ของ Android
เพิ่มองค์ประกอบต่อไปนี้ภายในแท็ก <application> ของไฟล์
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 มีไลบรารีการคำนวณดั้งเดิมที่จำเป็นต่อการเปิดใช้การเร่งระบบประสาทของ NPU และ GPU สำหรับงานการปรับปรุงสื่อ การประกาศไลบรารีเหล่านี้ในไฟล์ Manifest เป็นข้อกำหนดเบื้องต้นเพื่อให้ API ใช้ประโยชน์จากการเร่งฮาร์ดแวร์ได้ ซึ่งจำเป็นต่อการปรับปรุงคุณภาพสูงที่มีเวลาในการตอบสนองต่ำ ดูข้อมูลเพิ่มเติมเกี่ยวกับ OpenCL ได้ที่การใช้งาน OpenCL
OpenGL ES มีไลบรารีกราฟิกดั้งเดิมที่จำเป็นสำหรับการแสดงผลเอาต์พุตการปรับปรุงสื่อประสิทธิภาพสูง การประกาศไลบรารีเหล่านี้ในไฟล์ Manifest เป็นสิ่งสำคัญเพื่อให้มั่นใจว่าไปป์ไลน์การแสดงผลจะแสดงสื่อที่ประมวลผลแล้วบนพื้นผิวที่เร่งด้วยฮาร์ดแวร์ได้อย่างมีประสิทธิภาพ ดูข้อมูลเกี่ยวกับ OpenGL ได้ที่ ภาพรวมเอกสารประกอบเกี่ยวกับ OpenGL API
ไปป์ไลน์การแสดงผลของ Android ต้องเร่งด้วยฮาร์ดแวร์เพื่อป้องกันคอขวด แม้ว่าจะเปิดใช้โดยค่าเริ่มต้นสำหรับแอปที่กำหนดเป้าหมายเป็น API 14 ขึ้นไป แต่ให้ตั้งค่า
android:hardwareAccelerated="true" อย่างชัดเจนภายในแท็ก <activity>
ความเข้ากันได้ของอุปกรณ์และการตั้งค่าโมดูล
บริการ Google Play จะส่งโมเดลแมชชีนเลิร์นนิงแบบไดนามิกเพื่อประหยัดพื้นที่เก็บข้อมูล APK เริ่มต้น แอปพลิเคชันต้องใช้ EnhancementClient เพื่อตรวจสอบการรองรับฮาร์ดแวร์และตรวจสอบว่าได้ดาวน์โหลดและแคชน้ำหนักโมเดลที่จำเป็นไว้ในเครื่องแล้วก่อนที่จะทำการปรับปรุง กระบวนการนี้จะทำเพียงครั้งเดียวต่ออุปกรณ์
การใช้ suspendCancellableCoroutine ช่วยให้คุณรวม Callback ของไคลเอ็นต์ตามงานไว้ในฟังก์ชันระงับมาตรฐานของ Kotlin เพื่อการดำเนินการตามลำดับที่ชัดเจนยิ่งขึ้นได้
// 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) }
}