Media Enhancement API เป็นเครื่องมือที่มีประสิทธิภาพซึ่งใช้การเร่งความเร็ว GPU ในอุปกรณ์ เพื่อปรับปรุงรูปภาพคุณภาพสูงที่มีเวลาในการตอบสนองต่ำ ซึ่งรวมถึงฟีเจอร์ต่างๆ เช่น การแมปโทนสีอัตโนมัติ การปรับให้คมชัด การลดสัญญาณรบกวน และ การเพิ่มความละเอียด
ก่อนเริ่มต้น API คุณต้องกำหนดค่าการอ้างอิงของโปรเจ็กต์และ
ประกาศข้อกำหนดการเร่งฮาร์ดแวร์ในไฟล์ Manifest การข้ามการกำหนดค่าเหล่านี้
เป็นสาเหตุหลักของ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 Coroutines เพื่อจัดการเซสชันการเพิ่มประสิทธิภาพแบบอะซิงโครนัส
// 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 จะช่วยให้คุณสามารถรวมการเรียกกลับของไคลเอ็นต์ตามงานไว้ในฟังก์ชันระงับมาตรฐานของ 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) }
}