رابط برنامهنویسی کاربردی بهبود رسانه (Media Enhancement API) ابزاری قدرتمند است که از شتابدهندهی پردازندهی گرافیکی (GPU) روی دستگاه برای بهبود کیفیت تصویر با تأخیر کم و کیفیت بالا استفاده میکند. این شامل ویژگیهایی مانند نگاشت خودکار تُنها، رفع تاری، رفع نویز و افزایش مقیاس تصویر میشود.
قبل از مقداردهی اولیه API، باید وابستگیهای پروژه خود را پیکربندی کرده و الزامات شتاب سختافزاری را در مانیفست خود اعلام کنید. نادیده گرفتن این پیکربندیها علت اصلی خطاهای زمان اجرا GLOBAL_INIT_FAILED است.
وابستگیهای گرادل
وابستگیهای زیر را به فایل 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 گوگل مشاهده کنید.
ما همچنین استفاده از کوروتینهای کاتلین را برای مدیریت جلسات بهبود به صورت ناهمگام توصیه میکنیم.
// 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")
الزامات مانیفست اندروید
عناصر زیر را درون تگ <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 برای وظایف Media Enhancement را فراهم میکند. اعلام این کتابخانهها در مانیفست شما پیشنیازی برای API است تا از شتاب سختافزاری استفاده کند، که برای انجام بهبودهای با کیفیت بالا و با تأخیر کم ضروری است. برای اطلاعات بیشتر در مورد OpenCL، به پیادهسازیهای OpenCL مراجعه کنید.
OpenGL ES کتابخانههای گرافیکی بومی مورد نیاز برای رندرینگ با کارایی بالا از خروجیهای بهبود رسانه را فراهم میکند. اعلام این کتابخانهها در مانیفست شما ضروری است تا اطمینان حاصل شود که خط لوله رندرینگ میتواند رسانههای پردازش شده را به طور موثر روی سطوح شتابدهی شده توسط سختافزار نمایش دهد. برای اطلاعات بیشتر در مورد OpenGL، به مرور کلی مستندات API OpenGL مراجعه کنید.
خط لوله رندر اندروید باید از نظر سختافزاری شتابدهی شود تا از گلوگاهها جلوگیری شود. در حالی که به طور پیشفرض برای برنامههایی که API 14+ را هدف قرار میدهند فعال است، صریحاً android:hardwareAccelerated="true" را در تگهای <activity> خود تنظیم کنید.
سازگاری دستگاه و تنظیم ماژول
سرویسهای گوگل پلی مدلهای یادگیری ماشین را به صورت پویا ارائه میدهند تا فضای ذخیرهسازی اولیه APK شما را حفظ کنند. قبل از انجام بهبودها، برنامه باید از EnhancementClient برای تأیید پشتیبانی سختافزار و اطمینان از دانلود و ذخیره وزنهای مدل لازم به صورت محلی استفاده کند. این فرآیند یک بار در هر دستگاه انجام میشود.
با استفاده از suspendCancellableCoroutine ، میتوانید فراخوانیهای کلاینت مبتنی بر وظیفه را در توابع تعلیق استاندارد کاتلین قرار دهید تا اجرای آنها تمیزتر و ترتیبیتر باشد:
// 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) }
}