ملاحظة: تشير هذه الصفحة إلى حزمة Camera2. ننصحك باستخدام CameraX ما لم يتطلب تطبيقك ميزات معيّنة منخفضة المستوى من Camera2. تتوافق حزمتا CameraX وCamera2 مع الإصدار 5.0 من Android (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث.
تتيح واجهات برمجة التطبيقات Camera2 التقاط فيديوهات بنطاق عالي الديناميكية (HDR) ، ما يتيح لك معاينة محتوى الفيديو بنطاق HDR وتسجيله باستخدام الكاميرا. مقارنةً بالنطاق الديناميكي العادي (SDR)، يقدّم النطاق HDR مجموعة أوسع من الألوان ويزيد النطاق الديناميكي لمكوّن الإضاءة (من 100 cd/m2 حاليًا إلى آلاف cd/m2). ويؤدي ذلك إلى الحصول على جودة فيديو أكثر واقعية، مع ألوان أكثر ثراءً ومناطق أكثر سطوعًا وظلال أغمق.
تعرَّف على كيفية التقاط فيديو بنطاق HDR لغروب الشمس بتفاصيل أكثر حيوية.
المتطلبات الأساسية للجهاز
لا تتيح بعض أجهزة Android تسجيل الفيديوهات بنطاق HDR. قبل تسجيل فيديو بنطاق HDR في تطبيقك، تأكَّد من استيفاء جهازك للمتطلبات الأساسية التالية:
- يستهدف Android 13 (المستوى 33 من واجهة برمجة التطبيقات).
- يحتوي على مستشعر كاميرا بدقة 10 بت أو أعلى. لمزيد من المعلومات عن إتاحة النطاق HDR ، يُرجى الاطّلاع على التحقّق من إتاحة النطاق HDR.
بما أنّ بعض الأجهزة لا تستوفي المتطلبات الأساسية، يمكنك إضافة مسار رمز منفصل عند إعداد تسجيل الفيديوهات بنطاق HDR في تطبيقك. يتيح ذلك لتطبيقك الرجوع إلى النطاق SDR على الأجهزة غير المتوافقة. ضَع في اعتبارك أيضًا إضافة خيار واجهة مستخدم للنطاق SDR. يمكن للمستخدم بعد ذلك التبديل بين النطاقَين SDR وHDR لتسجيل الفيديوهات.
بنية تسجيل الفيديوهات بنطاق HDR
يوضّح الرسم البياني التالي المكوّنات الرئيسية لبنية تسجيل الفيديوهات بنطاق HDR.
عندما يسجّل جهاز الكاميرا إطارًا بنطاق HDR، يخصّص إطار عمل Camera2 مخزنًا مؤقتًا يخزّن ناتج مستشعر الكاميرا المعالَج.
ويُرفق أيضًا البيانات الوصفية الخاصة بالنطاق HDR إذا كان ذلك مطلوبًا في ملف HDR.
بعد ذلك، يضع إطار عمل Camera2 المخزن المؤقت الذي تم تعبئته في قائمة انتظار مساحة عرض الإخراج المُشار إليها في CaptureRequest، مثل شاشة العرض أو برنامج ترميز الفيديو، كما هو موضّح في المخطّط البياني.
التحقّق من إتاحة النطاق HDR
قبل تسجيل فيديو بنطاق HDR في تطبيقك، تأكَّد من أنّ الجهاز يتيح ملف HDR المطلوب.
استخدِم طريقة CameraManager getCameraCharacteristics() للحصول على مثيل
CameraCharacteristics
، يمكنك الاستعلام عنه لمعرفة إمكانات النطاق HDR في جهازك.
تتحقّق الخطوات التالية مما إذا كان الجهاز يتيح HLG10. HLG10 هو معيار النطاق HDR الأساسي الذي يجب أن يتيحه مصنّعو الأجهزة على الكاميرات التي تعرض إخراجًا بدقة 10 بت.
أولاً، تحقَّق مما إذا كان الجهاز يتيح ملفات بدقة 10 بت (عمق البت لـ HLG10):
Kotlin
private fun isTenBitProfileSupported(cameraId: String): Boolean { val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId) val availableCapabilities = cameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) for (capability in availableCapabilities!!) { if (capability == CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT) { return true } } return false }
بعد ذلك، تحقَّق مما إذا كان الجهاز يتيح HLG10 (أو ملفًا آخر متاحًا):
Kotlin
@RequiresApi(api = 33) private fun isHLGSupported(cameraId: String): Boolean { if (isTenBitProfileSupported(cameraId)) { Val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId) val availableProfiles = cameraCharacteristics .get(CameraCharacteristics.REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES)!! .getSupportedProfiles() // Checks for the desired profile, in this case HLG10 return availableProfiles.contains(DynamicRangeProfiles.HLG10) } return false; }
إذا كان الجهاز يتيح النطاق HDR، ستعرض isHLGSupported() دائمًا القيمة true.
لمزيد من المعلومات، يُرجى الاطّلاع على
CameraCharacteristics
المستندات المرجعية.
إعداد تسجيل الفيديوهات بنطاق HDR
بعد التأكّد من أنّ جهازك يتيح النطاق HDR، اضبط تطبيقك لتسجيل بث فيديو بنطاق HDR غير معالَج من الكاميرا.
استخدِم setDynamicRangeProfile() لتزويد OutputConfiguration
للبث بملف HDR متوافق مع الجهاز، يتم بعد ذلك تمريره
إلى CameraCaptureSession
عند إنشائه.
اطّلِع على قائمة ملفات HDR المتاحة.
في نموذج الرمز البرمجي التالي، تتحقّق الدالة setupSessionDynamicRangeProfile() أولاً من أنّ الجهاز يعمل بنظام Android 13.
بعد ذلك، يتم إعداد CameraCaptureSession باستخدام ملف HDR المتوافق مع الجهاز كـ OutputConfiguration:
Kotlin
/** * Creates a [CameraCaptureSession] with a dynamic range profile. */ private fun setupSessionWithDynamicRangeProfile( dynamicRange: Long, device: CameraDevice, targets: List, handler: Handler? = null, stateCallback: CameraCaptureSession.StateCallback ): Boolean { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { val outputConfigs = mutableListOf () for (target in targets) { val outputConfig = OutputConfiguration(target) //sets the dynamic range profile, for example DynamicRangeProfiles.HLG10 outputConfig.setDynamicRangeProfile(dynamicRange) outputConfigs.add(outputConfig) } device.createCaptureSessionByOutputConfigurations( outputConfigs, stateCallback, handler ) return true } else { device.createCaptureSession(targets, stateCallback, handler) return false } }
عندما يهيئ تطبيق الكاميرا الكاميرا، يرسل
متكررًا
CaptureRequest
لمعاينة التسجيل:
Kotlin
session.setRepeatingRequest(previewRequest, null, cameraHandler)
وأيضًا لبدء تسجيل الفيديو:
Kotlin
// Start recording repeating requests, which stops the ongoing preview // repeating requests without having to explicitly call // `session.stopRepeating` session.setRepeatingRequest(recordRequest, object : CameraCaptureSession.CaptureCallback() { override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) { if (currentlyRecording) { encoder.frameAvailable() } } }, cameraHandler)
ترميز بث الكاميرا بنطاق HDR
لترميز بث الكاميرا بنطاق HDR وكتابة الملف على القرص،
استخدِم MediaCodec.
أولاً، احصل على OutputSurface،
الذي يرتبط بمخزن مؤقت يخزّن بيانات الفيديو غير المعالَجة.
بالنسبة إلى MediaCodec،
استخدِم createInputSurface().
لتهيئة MediaCodec، يجب أن ينشئ التطبيق
MediaFormat باستخدام ملف برنامج ترميز ومساحة ألوان ونطاق ألوان ووظيفة نقل محدّدة:
Kotlin
val mimeType = when { dynamicRange == DynamicRangeProfiles.STANDARD -> MediaFormat.MIMETYPE_VIDEO_AVC dynamicRange < DynamicRangeProfiles.PUBLIC_MAX -> MediaFormat.MIMETYPE_VIDEO_HEVC else -> throw IllegalArgumentException("Unknown dynamic range format") } val codecProfile = when { dynamicRange == DynamicRangeProfiles.HLG10 -> MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10 dynamicRange == DynamicRangeProfiles.HDR10 -> MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10 dynamicRange == DynamicRangeProfiles.HDR10_PLUS -> MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus else -> -1 } // Failing to correctly set color transfer causes quality issues // for example, washout and color clipping val transferFunction = when (codecProfile) { MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10 -> MediaFormat.COLOR_TRANSFER_HLG MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10 -> MediaFormat.COLOR_TRANSFER_ST2084 MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus -> MediaFormat.COLOR_TRANSFER_ST2084 else -> MediaFormat.COLOR_TRANSFER_SDR_VIDEO } val format = MediaFormat.createVideoFormat(mimeType, width, height) // Set some properties. Failing to specify some of these can cause the MediaCodec // configure() call to throw an exception. format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface) format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate) format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate) format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL) if (codecProfile != -1) { format.setInteger(MediaFormat.KEY_PROFILE, codecProfile) format.setInteger(MediaFormat.KEY_COLOR_STANDARD, MediaFormat.COLOR_STANDARD_BT2020) format.setInteger(MediaFormat.KEY_COLOR_RANGE, MediaFormat.COLOR_RANGE_LIMITED) format.setInteger(MediaFormat.KEY_COLOR_TRANSFER, transferFunction) format.setFeatureEnabled(MediaCodecInfo.CodecCapabilities.FEATURE_HdrEditing, true) } mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)
لمزيد من التفاصيل حول التنفيذ، يُرجى الاطّلاع على تطبيق Camera2Video النموذجي
EncoderWrapper.kt.
صيغ HDR
بدءًا من Android 13، يجب أن تتيح أجهزة الكاميرا التي تعرض إخراجًا بدقة 10 بت تنسيق HLG10 لتسجيل الفيديوهات بنطاق HDR و تشغيلها. بالإضافة إلى ذلك، يمكن لمصنّعي الأجهزة تفعيل أي صيغة HDR يختارونها باستخدام بنية تسجيل الفيديوهات بنطاق HDR.
يلخّص الجدول التالي صيغ HDR المتاحة وإمكاناتها لتسجيل الفيديوهات بنطاق HDR.
| التنسيق | وظيفة النقل (TF) | البيانات الوصفية | برنامج الترميز | عمق البت |
|---|---|---|---|---|
| HLG10 | HLG | لا | HEVC | 10 بت |
| HDR10 | PQ | ثابت | HEVC | 10 بت |
| +HDR10 | PQ | ديناميكي | HEVC | 10 بت |
| Dolby Vision 8.4 | HLG | ديناميكي | HEVC | 10 بت |
الموارد
للاطّلاع على تطبيق عملي يتضمّن وظيفة تسجيل الفيديوهات بنطاق HDR، يُرجى الاطّلاع على نموذج Camera2Video على GitHub.