توفّر Media Enhancement API حلاً منخفض وقت الاستجابة ومستندًا إلى الذكاء الاصطناعي يحافظ على الخصوصية ومثبّتًا على الجهاز فقط، ويستفيد من تسريع الأجهزة لتقديم تحسينات عالية الجودة على الوسائط بدون زيادة حجم ملف APK. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة فهم إمكانات تحسين الوسائط.
يعرض مخطط البنية التالي دورة تنفيذ وضع مساحة العرض غير المتزامن في Media Enhancement API. يربط هذا الوضع مخازن الأجهزة مباشرةً لإزالة عنق الزجاجة في الأداء الناتج عن نسخ الإطارات غير المضغوطة ذهابًا وإيابًا بين مخازن ذاكرة وحدة المعالجة المركزية ووحدة معالجة الرسومات.
يتم تنفيذ مسار التحسين من خلال الخطوات التالية:
المرحلة 1. إعداد جلسة التحسين
1. توفير مساحة عرض الإدخال: يقدّم تطبيقك إطار عمل التحسين مع معرّف مساحة عرض إدخال للوصول إلى الإطارات من أجل معالجتها.
2. ضبط مساحة عرض الإخراج: يوفّر تطبيقك أهداف العرض ويربطها مباشرةً بالإطار
(مثل SurfaceView أو TextureView).
المرحلة 2. إنتاج إطار إدخال
3. إعداد الوسائط الأساسية: يستردّ تطبيقك الوسائط الأساسية غير المضغوطة. على سبيل المثال، من خلال قراءة ملف من قرص محلي.
4. إدخال بيانات الإطار: يكتب تطبيقك حمولة الصورة الأولية مباشرةً في مسار مساحة عرض الإدخال المرتبطة.
المرحلة 3. المعالجة والتحسين
5. تنفيذ معالجة الذكاء الاصطناعي: يعالج الإطار على وحدة معالجة الرسومات أو وحدة المعالجة العصبية في الجهاز، ويطبّق تحسينات تعلُّم الآلة، مثل ضبط درجة الألوان، أو إزالة التشويش أو زيادة الدقة.
6. عرض الإطار المحسّن: يعرض المحرّك الإطار المحسّن بكامل دقته مباشرةً على مساحة عرض الإخراج المرتبطة.
المرحلة 4. عرض النتيجة أو حفظها
7. وضع اللمسات الأخيرة على الإخراج: يتلقّى تطبيقك مخزن دفق الأجهزة المعالَج لعرضه في واجهة المستخدم أو حفظه مرة أخرى في وحدة التخزين.
EnhancementSession هو كائن سياق كبير الحجم يحافظ على مسار ذاكرة مستمر لوحدة معالجة الرسومات أو وحدة المعالجة العصبية. ويخصّص ذاكرة وصول عشوائي مخصّصة للفيديو (VRAM) ومعرّفات النظام الأصلية. لمنع حدوث تسرّبات شديدة في الذاكرة وحالات تعطُّل محتملة بسبب OutOfMemoryError، يجب الالتزام بمبادئ مراحل النشاط التالية:
- الإنشاء عند الحاجة: لا تنشئ جلسة إلى أن يبدأ المستخدم إجراء تحسين.
- إعادة الاستخدام الاستراتيجي: احتفِظ بمثيل جلسة واحد وأعِد استخدامه عند معالجة عمليات البث أو الإطارات التي تتضمّن إعدادات متطابقة (الأبعاد و الخيارات التي تم تفعيلها).
- الإيقاف الفوري: استدعِ
session.release()فور انتهاء المهام المرئية لتحرير موارد الأجهزة المشترَكة.
إعداد محرّك التحسين
تنسّق هذه الطريقة عملية تحقّق من خطوتين. تتحقّق أولاً مما إذا كانت أجهزة الجهاز تتيح التسريع، ثم تتأكّد من توفّر وحدات تعلُّم الآلة المطلوبة.
يمنع تنفيذ هذه الطريقة كخطوة أساسية حدوث حالات تعذُّر في الإعداد أثناء وقت التشغيل من خلال التحقّق من الإمكانات قبل أن يحاول تطبيقك معالجة الوسائط.
class MediaSetupViewModel(application: Application) : AndroidViewModel(application) {
private val enhancementClient = Enhancement.getClient(application)
fun initializeEnhancementEngine() {
viewModelScope.launch {
try {
// 1. Verify hardware capability
val isSupported = enhancementClient.isDeviceSupportedAsync()
if (!isSupported) {
notifyUiDeviceIncompatible()
return@launch
}
// 2. Verify and download the Google Play services ML modules
val isInstalled = enhancementClient.isModuleInstalledAsync()
if (!isInstalled) {
notifyUiDownloadingModels()
enhancementClient.installModule().await()
}
notifyUiEngineReady()
} catch (e: Exception) {
// Handle potential errors during session creation or image
// processing.
handleInitializationError(e)
}
}
}
}
التنفيذ: وضع مساحة العرض (مساحة عرض للإدخال ومساحة عرض للإخراج)
يتجنّب وضع تنفيذ مساحة العرض (EnhancementMode.SURFACE) زيادة الأداء الناتجة عن نقل الإطارات بين مخازن ذاكرة وحدة المعالجة المركزية ووحدة معالجة الرسومات. بدلاً من ذلك، تربط مكتبة التحسين مخازن الأجهزة الأولية مباشرةً، وتقرأ الإطارات من مساحة عرض إدخال، وتعالجها بشكلٍ أصلي، وتوجّهها مباشرةً إلى مساحة عرض إخراج.
لقطات مساحة العرض لإطار واحد
تُستخدَم هذه الطريقة لتطبيق التأثيرات بكفاءة على إطار صورة واحد تم فك ترميزه على الجهاز.
// Provisions input Surface (for example, ImageReader) and output Surface (for
// example, SurfaceView)
val inputSurface: Surface = imageReader.surface
val outputSurface: Surface = surfaceView.holder.surface
// 1. Configure parameters for SURFACE mode
val surfaceOptions = EnhancementOptions(
imageReader.width,
imageReader.height,
EnhancementMode.SURFACE,
enableTonemap = true,
enableDeblurDenoise = true,
enableFaceDetection = false
).also {
// 2. Bind hardware surfaces
it.setInputSurface(inputSurface)
it.setOutputSurface(outputSurface)
}
// 3. Create the session to process the hardware frame
val singleFrameSession = enhancementClient.createSessionAsync(surfaceOptions, executor)
// The API processes the single frame. Upon completion, release the session.
singleFrameSession.release()