ل تسجيل الفيديو، يمكن للمستخدمين الآن التقاط مقاطع فيديو مذهلة ذات حركة بطيئة أو ذات معدل إطارات مرتفع دون عناء. والأهم من ذلك الجديد واجهة برمجة تطبيقات مجموعة الميزات يسمح لك بتمكين المجموعات المعقدة مثل HDR 10 بت و60 إطارًا في الثانيةمما يضمن الحصول على نتائج متسقة عبر الأجهزة المدعومة.
على التقاط الصورة في المقدمة، يمكنك الحصول على أقصى قدر من المرونة مع دعم التقاط ملفات DNG (RAW) غير المعالجة وغير المضغوطة. بالإضافة إلى ذلك، يمكنك الآن الاستفادة من إخراج Ultra HDR حتى عند استخدام ملحقات الكاميرا القوية.
الجديد هو الذي يدعم هذه الميزات واجهة برمجة تطبيقات تكوين الجلسة، مما يبسط عملية إعداد الكاميرا وإعادة تكوينها. الآن، دعونا نتعمق في تفاصيل هذه الميزات الجديدة والمثيرة.
تسجيل فيديو قوي: مجموعات عالية السرعة والميزات
يعمل CameraX 1.5 على توسيع قدرات الفيديو بشكل كبير، مما يتيح تجارب تسجيل أكثر إبداعًا وقوة.
فيديو بطيء الحركة ومعدل إطارات مرتفع
إحدى ميزاتنا الأكثر توقعًا، وهي الفيديو بالحركة البطيئة، متاحة الآن. يمكنك الآن التقاط فيديو عالي السرعة (على سبيل المثال، 120 أو 240 إطارًا في الثانية) وترميزه مباشرة إلى فيديو درامي بطيء الحركة. وبدلاً من ذلك، يمكنك التسجيل بنفس معدل الإطارات المرتفع لإنتاج فيديو سلس بشكل استثنائي.
يعد تنفيذ هذا أمرًا مباشرًا إذا كنت معتادًا على التقاط الفيديو واجهة برمجة التطبيقات.
-
تحقق من الدعم عالي السرعة: استخدم الجديد Recorder.getHighSpeedVideoCapabilities() طريقة الاستعلام عما إذا كان الجهاز يدعم هذه الميزة.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector) val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo) if (highSpeedCapabilities == null) { // This camera device does not support high-speed video. return }
-
تكوين حالة الاستخدام وربطها: استخدم العائد قدرات الفيديو (الذي يحتوي على معلومات جودة الفيديو المدعومة) لإنشاء ملف HighSpeedVideoSessionConfig. يجب عليك بعد ذلك الاستعلام عن نطاقات معدل الإطارات المدعومة عبر كاميراInfo.getSupportedFrameRateRanges () وضبط النطاق المطلوب. استدعاء setSlowMotionEnabled (صحيح) لتسجيل مقاطع فيديو بطيئة الحركة، وإلا فسيتم تسجيل مقاطع فيديو ذات معدل إطارات مرتفع. والخطوة الأخيرة هي استخدام العادية مسجل.تحضيرRecording().start() لبدء تسجيل الفيديو.
val preview = Preview.Builder().build() val quality = highSpeedCapabilities .getSupportedQualities(DynamicRange.SDR).first() val recorder = Recorder.Builder() .setQualitySelector(QualitySelector.from(quality))) .build() val videoCapture = VideoCapture.withOutput(recorder) val frameRateRange = cameraInfo.getSupportedFrameRateRanges( HighSpeedVideoSessionConfig(videoCapture, preview) ).first() val sessionConfig = HighSpeedVideoSessionConfig( videoCapture, preview, frameRateRange = frameRateRange, // Set true for slow-motion playback, or false for high-frame-rate isSlowMotionEnabled = true ) cameraProvider.bindToLifecycle( lifecycleOwner, cameraSelector, sessionConfig) // Start recording slow motion videos. val recording = recorder.prepareRecording(context, outputOption) .start(executor, {})
التوافق والقيود
يتطلب التسجيل عالي السرعة محددًا جلسة التقاط عالية السرعة مقيدة بالكاميرا و ملف تعريف كاميرا الفيديو يدعم. قم دائمًا بإجراء فحص القدرة، وقم بتمكين التسجيل عالي السرعة فقط على الأجهزة المدعومة لمنع تجربة المستخدم السيئة. حاليًا، يتم دعم هذه الميزة في الكاميرات الخلفية لجميع أجهزة Pixel تقريبًا ونماذج مختارة من الشركات المصنعة الأخرى.
تحقق من مشاركة مدونة لمزيد من التفاصيل.
الجمع بين الميزات بثقة: واجهة برمجة تطبيقات مجموعة الميزات
يقدم CameraX 1.5 واجهة برمجة تطبيقات مجموعة الميزات، مما يلغي التخمين بشأن توافق الميزات. استنادًا إلى استعلام مجموعة ميزات Android 15 واجهة برمجة التطبيقات، يمكنك الآن بكل ثقة تمكين ميزات متعددة معًا، مما يضمن جلسة كاميرا مستقرة. تدعم مجموعة الميزات حاليًا: HDR (HLG)، 60 إطارًا في الثانية، وتثبيت المعاينة، وUltra HDR. على سبيل المثال، يمكنك تمكين HDR و60 إطارًا في الثانية وتثبيت المعاينة في وقت واحد على سلسلة Pixel 10 وGalaxy S25. ومن المقرر أن تشمل التحسينات المستقبلية تسجيل 4K والتكبير/التصغير الواسع جدًا.
تتيح واجهة برمجة تطبيقات مجموعة الميزات حالتين استخدام أساسيتين:
حالة الاستخدام 1: إعطاء الأولوية للجودة الأفضل
إذا كنت تريد الالتقاط باستخدام أفضل مجموعة ممكنة من الميزات، فيمكنك تقديم قائمة أولويات. سيحاول CameraX تمكينها بالترتيب، مع تحديد المجموعة الأولى التي يدعمها الجهاز بالكامل.
val sessionConfig = SessionConfig( useCases = listOf(preview, videoCapture), preferredFeatureGroup = listOf( GroupableFeature.HDR_HLG10, GroupableFeature.FPS_60, GroupableFeature.PREVIEW_STABILIZATION ) ).apply { // (Optional) Get a callback with the enabled features to update your UI. setFeatureSelectionListener { selectedFeatures -> updateUiIndicators(selectedFeatures) } } processCameraProvider.bindToLifecycle(activity, cameraSelector, sessionConfig)
في هذا المثال، يحاول CameraX تمكين الميزات بالترتيب التالي:
-
HDR + 60 إطارًا في الثانية + تثبيت المعاينة
-
HDR + 60 إطارًا في الثانية
-
HDR + تثبيت المعاينة
-
تقرير التنمية البشرية
-
60 إطارًا في الثانية + تثبيت المعاينة
-
60 إطارًا في الثانية
-
معاينة الاستقرار
-
لا أحد
حالة الاستخدام 2: إنشاء واجهة مستخدم للإعدادات التي تواجه المستخدم
يمكنك الآن أن تعكس بدقة مجموعات الميزات المدعومة في واجهة مستخدم إعدادات تطبيقك، مع تعطيل التبديل للخيارات غير المدعومة مثل الصورة أدناه.
لتحديد ما إذا كان سيتم إيقاف التبديل باللون الرمادي أم لا، استخدم الرموز التالية للتحقق من دعم مجموعة الميزات. في البداية، استعلم عن حالة كل ميزة على حدة. بمجرد تمكين إحدى الميزات، أعد الاستعلام عن الميزات المتبقية باستخدام الميزات الممكّنة لمعرفة ما إذا كان يجب الآن أن تكون مفاتيح التبديل الخاصة بها باللون الرمادي بسبب قيود التوافق.
fun disableFeatureIfNotSuported( enabledFeatures: Set<GroupableFeature>, featureToCheck:GroupableFeature ) { val sessionConfig = SessionConfig( useCases = useCases, requiredFeatureGroup = enabledFeatures + featureToCheck ) val isSupported = cameraInfo.isFeatureGroupSupported(sessionConfig) if (!isSupported) { // disable the toggle for featureToCheck } }
يرجى الرجوع إلى مشاركة مدونة المجموعة المميزة لمزيد من المعلومات.
المزيد من تحسينات الفيديو
-
تحسينات الكاميرا المتزامنة: باستخدام CameraX 1.5.1، يمكنك الآن ربط حالات الاستخدام Preview + ImageCapture + VideoCapture بشكل متزامن لكل منها تكوين الكاميرا المفردة في وضع غير التكوين. بالإضافة إلى ذلك، في وضع التكوين (نفس حالات الاستخدام مع إعدادات التكوين)، يمكنك الآن ضبط تأثير الكاميرا الذي يتم تطبيقه على نتيجة التكوين النهائية.
-
كتم الصوت الديناميكي: يمكنك الآن بدء التسجيل في حالة كتم الصوت باستخدام PendingRecording.withAudioEnabled(boolean originalMuted) والسماح للمستخدم بإلغاء كتم الصوت باستخدامه لاحقًا التسجيل. كتم الصوت (كتم الصوت المنطقي).
-
تحسين التعامل مع التخزين غير الكافي: يقوم CameraX الآن بإرسال ملف VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE خطأ، مما يسمح لتطبيقك بالتعامل بأمان مع حالات انخفاض مساحة التخزين وإبلاغ المستخدم.
-
تعزيز الإضاءة المنخفضة: على الأجهزة المدعومة (مثل سلسلة Pixel 10)، يمكنك تمكينها CameraControl.enableLowLightBoostAsync لتفتيح المعاينة وتدفقات الفيديو تلقائيًا في البيئات المظلمة.
التقاط الصور بدرجة احترافية
يقدم CameraX 1.5 ترقيات كبيرة لـ التقاط الصور للمطورين الذين يطالبون بأقصى قدر من الجودة والمرونة.
أطلق العنان للتحكم الإبداعي من خلال التقاط DNG (RAW).
للتحكم الكامل في مرحلة ما بعد المعالجة، يدعم CameraX الآن التقاط DNG (RAW). ويمنحك هذا إمكانية الوصول إلى بيانات الصورة غير المعالجة وغير المضغوطة مباشرة من مستشعر الكاميرا، مما يتيح التحرير بدرجة احترافية وتدرج الألوان. تدعم واجهة برمجة التطبيقات (API) التقاط ملف DNG بمفرده، أو التقاط مخرجات JPEG وDNG المتزامنة. راجع نموذج التعليمات البرمجية أدناه للتعرف على كيفية التقاط ملفات JPEG وDNG في وقت واحد.
val capabilities = ImageCapture.getImageCaptureCapabilities(cameraInfo) val imageCapture = ImageCapture.Builder().apply { if (capabilities.supportedOutputFormats .contains(OUTPUT_FORMAT_RAW_JPEG)) { // Capture both RAW and JPEG formats. setOutputFormat(OUTPUT_FORMAT_RAW_JPEG) } }.build() // ... bind imageCapture to lifecycle ... // Provide separate output options for each format. val outputOptionRaw = /* ... configure for image/x-adobe-dng ... */ val outputOptionJpeg = /* ... configure for image/jpeg ... */ imageCapture.takePicture( outputOptionRaw, outputOptionJpeg, executor, object : ImageCapture.OnImageSavedCallback { override fun onImageSaved(results: OutputFileResults) { // This callback is invoked twice: once for the RAW file // and once for the JPEG file. } override fun onError(exception: ImageCaptureException) {} } )
Ultra HDR لملحقات الكاميرا
احصل على أفضل ما في كلا العالمين: التصوير الفوتوغرافي الحسابي المذهل لملحقات الكاميرا (مثل الوضع الليلي) جنبًا إلى جنب مع الألوان الرائعة والنطاق الديناميكي لتقنية Ultra HDR. هذه الميزة مدعومة الآن في العديد من هواتف Android المتميزة الحديثة، مثل سلسلة Pixel 9/10 وسلسلة Samsung S24/S25.
// Support UltraHDR when Extension is enabled. val extensionsEnabledCameraSelector = extensionsManager .getExtensionEnabledCameraSelector( CameraSelector.DEFAULT_BACK_CAMERA, ExtensionMode.NIGHT) val imageCapabilities = ImageCapture.getImageCaptureCapabilities( cameraProvider.getCameraInfo(extensionsEnabledCameraSelector) val imageCapture = ImageCapture.Builder() .apply { if (imageCapabilities.supportedOutputFormats .contains(OUTPUT_FORMAT_JPEG_ULTRA_HDR) { setOutputFormat(OUTPUT_FORMAT_JPEG_ULTRA_HDR) } }.build()
واجهة برمجة التطبيقات الأساسية وتحسينات سهولة الاستخدام
طريقة جديدة للتكوين: تكوين الجلسة
كما رأينا في الأمثلة أعلاه، تكوين الجلسة هو مفهوم جديد في CameraX 1.5. فهو يقوم بمركزية التكوين وتبسيط واجهة برمجة التطبيقات (API) بطريقتين رئيسيتين:
-
لا مزيد من الدليل فك الارتباط () المكالمات: تعتبر واجهات برمجة تطبيقات CameraX مدركة لدورة الحياة. سيؤدي ذلك ضمنيًا إلى “إلغاء ربط” حالات الاستخدام الخاصة بك عند حدوث نشاط أو غيره LifecycleOwner تم تدميره. لكن تحديث حالات الاستخدام أو تبديل الكاميرات لا يزال يتطلب منك الاتصال فك الارتباط () أو إلغاء ربط الكل () قبل إعادة الربط. الآن مع CameraX 1.5، عندما تقوم بربط ملف جديد تكوين الجلسة, يقوم CameraX بتحديث الجلسة بسلاسة، مما يلغي الحاجة إلى إلغاء ربط المكالمات.
-
التحكم في معدل الإطار الحتمي: الجديد تكوين الجلسة تقدم واجهة برمجة التطبيقات (API) طريقة حتمية لإدارة معدل الإطارات. على عكس السابق setTargetFrameRate, والذي كان مجرد تلميح، هذا الأسلوب الجديد الضمانات سيتم تطبيق نطاق معدل الإطارات المحدد عند التكوين الناجح. لضمان الدقة، يجب عليك الاستعلام عن معدلات الإطارات المدعومة باستخدام CameraInfo.getSupportedFrameRateRanges(SessionConfig). باجتياز كامل تكوين الجلسة, يمكن لـ CameraX تحديد النطاقات المدعومة بدقة بناءً على تكوينات البث.
أصبح إنشاء الكاميرا مستقرًا الآن
نحن نعلم مدى استمتاعك بـ Jetpack Compose، ويسعدنا أن نعلن أن تأليف الكاميرا المكتبة الآن مستقرة في الإصدار 1.5.1! يتضمن هذا الإصدار إصلاحات الأخطاء الهامة المتعلقة بـ CameraXViewfinder الاستخدام مع ميزات الإنشاء مثل mobileContentOf و بيجر, بالإضافة إلى حل مشكلة تمديد المعاينة. سنستمر في إضافة المزيد من الميزات إلى تأليف الكاميرا في الإصدارات المستقبلية.
تحسينات في تحليل الصور والتحكم في الكاميرا
-
تعديل قوة الشعلة: احصل على تحكم دقيق في شعلة الجهاز باستخدام واجهات برمجة التطبيقات الجديدة. يمكنك الاستعلام عن الحد الأقصى للقوة المدعومة باستخدام CameraInfo.getMaxTorchStrengthLevel() ثم قم بتعيين المستوى المطلوب باستخدام CameraControl.setTorchStrengthLevel().
-
دعم NV21 في تحليل الصورة: يمكنك الآن طلب تنسيق الصورة NV21 مباشرة من تحليل الصورة, تبسيط التكامل مع المكتبات وواجهات برمجة التطبيقات الأخرى. يتم تمكين هذا عن طريق الاستدعاء ImageAnalogy.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21).
ابدأ اليوم
قم بتحديث تبعياتك إلى CameraX 1.5 اليوم واستكشف الميزات الجديدة والمثيرة. لا يمكننا الانتظار لرؤية ما تقوم ببنائه.
لاستخدام CameraX 1.5، يرجى إضافة التبعيات التالية إلى libs.versions.toml الخاص بك. (نوصي باستخدام الإصدار 1.5.1 الذي يحتوي على العديد من إصلاحات الأخطاء الهامة والتحسينات المتزامنة للكاميرا.)
[versions] camerax = "1.5.1" [libraries] .. androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" } androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" } androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" } androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" } androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" } androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" }
ثم قم بإضافة هذه إلى تبعيات الوحدة النمطية الخاصة بك build.gradle.kts:
dependencies {
..
implementation(libs.androidx.camera.core)
implementation(libs.androidx.camera.lifecycle)
implementation(libs.androidx.camera.camera2)
implementation(libs.androidx.camera.view) // for PreviewView
implementation(libs.androidx.camera.compose) // for compose UI
implementation(libs.androidx.camera.extensions) // For Extensions
}
هل لديك أسئلة أو تريد التواصل مع فريق CameraX؟ انضم إلى مجموعة مناقشة مطوري CameraX أو قم بتقديم تقرير بالأخطاء:

