เริ่มต้นใช้งาน Media Enhancement API

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