تسجيل فيديو عالي السرعة وتصوير بطيء باستخدام CameraX 1.5
يستغرق الاطّلاع على المقال 6 دقائق
تُعدّ القدرة على التقاط صور واضحة للحركة السريعة ميزة أساسية في تطبيقات الكاميرا الحديثة. ويتم ذلك من خلال التقاط الصور بسرعة عالية، أي عملية الحصول على لقطات بمعدلات مثل 120 أو 240 لقطة في الثانية. يمكن استخدام هذه اللقطات العالية الدقة لغرضَين مختلفَين: إنشاء فيديو بمعدّل لقطات مرتفع لإجراء تحليل مفصّل لكل لقطة، أو إنشاء فيديو بالحركة البطيئة حيث تتكشّف الأحداث بشكل درامي على الشاشة.
في السابق، كان تنفيذ هذه الميزات باستخدام Camera2 API يتطلّب جهدًا أكبر. أما الآن، فبفضل واجهة برمجة التطبيقات الجديدة عالية السرعة في CameraX 1.5، أصبحت العملية بأكملها أبسط، ما يمنحك المرونة لإنشاء فيديوهات بمعدل لقطات مرتفع أو مقاطع فيديو جاهزة للتشغيل بالحركة البطيئة. ستوضّح لك هذه المشاركة كيفية إتقان كليهما. إذا كنت من مستخدمي CameraX الجدد، يمكنك الاطّلاع على نظرة عامة حول CameraX.
المبدأ الأساسي للتصوير البطيء
المبدأ الأساسي للتصوير البطيء هو تسجيل الفيديو بعدد لقطات في الثانية أعلى بكثير من عدد اللقطات التي يتم تشغيل الفيديو بها. على سبيل المثال، إذا سجّلت حدثًا مدته ثانية واحدة بمعدّل 120 لقطة في الثانية ثم شغّلت هذا التسجيل بمعدّل 30 لقطة في الثانية، سيستغرق تشغيل الفيديو أربع ثوانٍ. هذا "التمديد" للوقت هو ما يخلق تأثير الحركة البطيئة الدرامية، ما يتيح لك رؤية التفاصيل التي تكون أسرع من أن تراها العين المجردة.
لضمان أن يكون الفيديو النهائي سلسًا، يجب عادةً عرضه بمعدل 30 لقطة في الثانية على الأقل. هذا يعني أنّه لإنشاء فيديو بالحركة البطيئة بمعدل 4 أضعاف، يجب أن يكون عدد اللقطات في الثانية الأصلي 120 لقطة في الثانية على الأقل (120 لقطة في الثانية ÷ 4 = 30 لقطة في الثانية).
بعد تسجيل اللقطات بعدد لقطات مرتفع في الثانية، هناك طريقتان أساسيتان لتحقيق النتيجة المرجوة:
- التصوير البطيء الذي يتحكّم فيه اللاعب (فيديو بمعدل عرض لقطات مرتفع): يتم حفظ التسجيل عالي السرعة (مثل 120 لقطة في الثانية) مباشرةً كملف فيديو بمعدل عرض لقطات مرتفع. ويكون مشغّل الفيديو مسؤولاً عن خفض سرعة التشغيل. يمنح ذلك المستخدم المرونة للتبديل بين التشغيل العادي والتشغيل بالحركة البطيئة.
- فيديو جاهز للتشغيل بالحركة البطيئة (فيديو تمت إعادة ترميزه): تتم معالجة بث الفيديو عالي السرعة وإعادة ترميزه في ملف بمعدّل عدد اللقطات في الثانية عادي (مثل 30 عدد اللقطات في الثانية). يتم "تضمين" تأثير التصوير البطيء من خلال تعديل الطوابع الزمنية للّقطات. سيتم تشغيل الفيديو الناتج في وضع التصوير البطيء في أي مشغّل فيديو عادي بدون الحاجة إلى معالجة خاصة. مع أنّ الفيديو يتم تشغيله بالتصوير البطيء تلقائيًا، يمكن لمشغّلات الفيديو أن توفّر عناصر تحكّم في سرعة التشغيل تتيح للمستخدم زيادة السرعة ومشاهدة الفيديو بالسرعة الأصلية.
تسهّل واجهة برمجة التطبيقات CameraX API هذه العملية من خلال توفير طريقة موحّدة لاختيار الأسلوب الذي تريده، كما سترى أدناه.
واجهة برمجة التطبيقات الجديدة للفيديوهات العالية السرعة
تم إنشاء حلّ CameraX الجديد استنادًا إلى مكوّنَين رئيسيَّين:
Recorder#getHighSpeedVideoCapabilities(CameraInfo): تتيح لك هذه الطريقة التحقّق ممّا إذا كان بإمكان الكاميرا التسجيل بسرعة عالية، وفي حال توفّر هذه الإمكانية، يمكنك معرفة الدِقّات المتوافقة (عناصرQuality).HighSpeedVideoSessionConfig: هذا عنصر إعداد خاص يجمع حالات استخدامVideoCaptureوPreview، ويطلب من CameraX إنشاء جلسة كاميرا موحّدة عالية السرعة. يُرجى العِلم أنّه على الرغم من أنّ بث VideoCapture سيعمل بمعدّل عدد اللقطات في الثانية مرتفع تم ضبطه، سيتم عادةً حصر بث "المعاينة" بمعدّل عادي يبلغ 30 عدد اللقطات في الثانية على الأقل من خلال نظام الكاميرا لضمان عرض سلس على الشاشة.
البدء
قبل البدء، تأكَّد من إضافة تبعيات CameraX اللازمة إلى ملف build.gradle.kts في تطبيقك. ستحتاج إلى العنصر camera-video بالإضافة إلى مكتبات CameraX الأساسية.
// build.gradle.kts (Module: app)
dependencies {
val camerax_version = "1.5.1"
implementation("androidx.camera:camera-core:$camerax_version")
implementation("androidx.camera:camera-camera2:$camerax_version")
implementation("androidx.camera:camera-lifecycle:$camerax_version")
implementation("androidx.camera:camera-video:$camerax_version")
implementation("androidx.camera:camera-view:$camerax_version")
}ملاحظة بشأن واجهات برمجة التطبيقات التجريبية
يُرجى العِلم أنّ واجهات برمجة التطبيقات لتسجيل الفيديو بسرعة عالية هي حاليًا تجريبية. وهذا يعني أنّها ستخضع للتغيير في الإصدارات المستقبلية. لاستخدامها، يجب الموافقة عليها من خلال إضافة التعليق التوضيحي التالي إلى الرمز:
@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
التنفيذ
تبدأ عملية التنفيذ لكلا النتيجتين بخطوات الإعداد نفسها. يعتمد الاختيار بين إنشاء فيديو بمعدل لقطات مرتفع أو فيديو بالحركة البطيئة على إعداد واحد.
1. إعداد ميزة "التقاط الصور بسرعة عالية"
أولاً، بغض النظر عن هدفك، عليك الحصول على ProcessCameraProvider والتحقّق من إمكانات الجهاز وإنشاء حالات الاستخدام.
تعرض مجموعة الرموز البرمجية التالية تسلسل الإعداد الكامل ضمن دالة تعليق. يمكنك استدعاء هذه الدالة من نطاق روتين فرعي، مثل lifecycleScope.launch.
// Add the OptIn annotation at the top of your function or class
@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
private suspend fun setupCamera() {
// Asynchronously get the CameraProvider
val cameraProvider = ProcessCameraProvider.awaitInstance(this)
// -- CHECK CAPABILITIES --
val cameraInfo = cameraProvider.getCameraInfo(CameraSelector.DEFAULT_BACK_CAMERA)
val videoCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)
if (videoCapabilities == null) {
// This camera device does not support high-speed video.
return
}
// -- CREATE USE CASES --
val preview = Preview.Builder().build()
// You can create a Recorder with default settings.
// CameraX will automatically select a suitable quality.
val recorder = Recorder.Builder().build()
// Alternatively, to use a specific resolution, you can configure the
// Recorder with a QualitySelector. This is useful if your app has
// specific resolution requirements or you want to offer user
// preferences.
// To use a specific quality, you can uncomment the following lines.
// Get the list of qualities supported for high-speed video.
// val supportedQualities = videoCapabilities.getSupportedQualities(DynamicRange.SDR)
// Build the Recorder using the quality from the supported list.
// val recorderWithQuality = Recorder.Builder()
// .setQualitySelector(QualitySelector.from(supportedQualities.first()))
// .build()
// Create the VideoCapture use case, using either recorder or recorderWithQuality
val videoCapture = VideoCapture.withOutput(recorder)
// Now you are ready to configure the session for your desired output...
}2. اختيار الإخراج
الآن، عليك تحديد نوع الفيديو الذي تريد إنشاءه. سيتم تشغيل هذه التعليمات البرمجية داخل الدالة setupCamera() suspend الموضّحة أعلاه.
الخيار (أ): إنشاء فيديو بمعدّل لقطات مرتفع
حدِّد هذا الخيار إذا أردت أن يحتوي الملف النهائي على معدّل لقطات مرتفع (مثل فيديو بمعدّل 120 لقطة في الثانية).
// Create a builder for the high-speed session val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture) .setPreview(preview) // Query and apply a supported frame rate. Common supported frame rates include 120 and 240 fps. val supportedFrameRateRanges = cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build()) sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())
الخيار "ب": إنشاء فيديو جاهز للتشغيل بالحركة البطيئة
حدِّد هذا الخيار إذا أردت فيديو يتم تشغيله بالحركة البطيئة تلقائيًا في أي مشغّل فيديو عادي.
// Create a builder for the high-speed session val sessionConfigBuilder = HighSpeedVideoSessionConfig.Builder(videoCapture) .setPreview(preview) // This is the key: enable automatic slow-motion! sessionConfigBuilder.setSlowMotionEnabled(true) // Query and apply a supported frame rate. Common supported frame rates include 120, 240, and 480 fps. val supportedFrameRateRanges = cameraInfo.getSupportedFrameRateRanges(sessionConfigBuilder.build()) sessionConfigBuilder.setFrameRateRange(supportedFrameRateRanges.first())
هذا الخيار الفردي هو المفتاح لإنشاء فيديو جاهز للعرض بالحركة البطيئة. عندما تكون قيمة setSlowMotionEnabled صحيحة، تعالج CameraX البث السريع وتحفظه كملف فيديو عادي بمعدل 30 لقطة في الثانية. يتم تحديد سرعة التصوير البطيء من خلال نسبة عدد اللقطات في الثانية إلى معدّل التشغيل العادي هذا.
على سبيل المثال:
- سيؤدي التسجيل بمعدل 120 لقطة في الثانية إلى إنشاء فيديو يتم تشغيله بسرعة 1/4x (120 ÷ 30 = 4).
- سيؤدي التسجيل بمعدّل 240 لقطة في الثانية إلى إنشاء فيديو يتم تشغيله بسرعة 1/8 (240 ÷ 30 = 8).
تجميع كلّ العناصر معًا: تسجيل الفيديو
بعد ضبط HighSpeedVideoSessionConfig وربطه بدورة الحياة، تتمثّل الخطوة الأخيرة في بدء التسجيل. إنّ عملية إعداد خيارات الإخراج وبدء التسجيل والتعامل مع أحداث الفيديو هي نفسها كما هي الحال بالنسبة إلى تسجيل الفيديو العادي.
تركز هذه المشاركة على إعدادات السرعة العالية، لذلك لن نتناول عملية التسجيل بالتفصيل. للحصول على دليل شامل حول كل شيء، بدءًا من إعداد عنصر FileOutputOptions أو MediaStoreOutputOptions إلى التعامل مع عمليات معاودة الاتصال VideoRecordEvent، يُرجى الرجوع إلى مستندات VideoCapture.
// Bind the session config to the lifecycle
cameraProvider.bindToLifecycle(
this as LifecycleOwner,
CameraSelector.DEFAULT_BACK_CAMERA,
sessionConfigBuilder.build() // Bind the config object from Option A or B
)
// Start the recording using the VideoCapture use case
val recording = videoCapture.output
.prepareRecording(context, outputOptions) // See docs for creating outputOptions
.start(ContextCompat.getMainExecutor(context)) { recordEvent ->
// Handle recording events (e.g., Start, Pause, Finalize)
}إتاحة فيديوهات التصوير البطيء في "صور Google"
عند تفعيل setSlowMotionEnabled(true) في CameraX، يكون ملف الفيديو الناتج مصمَّمًا ليتم التعرّف عليه وتشغيله على الفور كفيديو بالحركة البطيئة في مشغّلات الفيديو وتطبيقات المعرض العادية. توفّر "صور Google" على وجه الخصوص وظائف محسّنة لهذه الفيديوهات التي تم تسجيلها بسرعة 120 أو 240 أو 360 أو 480 أو 960 لقطة في الثانية:
- التعرّف على واجهة المستخدم المميزة في الصورة المصغّرة: في مكتبتك على "صور Google"، يمكن التعرّف على فيديوهات الحركة البطيئة من خلال عناصر واجهة مستخدم معيّنة تميّزها عن الفيديوهات العادية.
|
|
| الصورة المصغّرة العادية للفيديو | صورة مصغّرة لفيديو بتصوير بطيء |
- مقاطع الفيديو ذات السرعة القابلة للتعديل أثناء التشغيل: عند تشغيل فيديو بالحركة البطيئة، توفّر "صور Google" عناصر تحكّم لتعديل الأجزاء التي يتم تشغيلها بسرعة بطيئة والأجزاء التي يتم تشغيلها بالسرعة العادية، ما يمنح المستخدمين تحكّمًا إبداعيًا. يمكن بعد ذلك تصدير الفيديو المعدَّل كملف فيديو جديد باستخدام الزر مشاركة، مع الاحتفاظ بمقاطع الحركة البطيئة التي حدّدتها.
|
|
| تشغيل الفيديو العادي | تشغيل فيديو بتصوير بطيء مع عناصر تحكّم في التعديل |
ملاحظة حول الأجهزة المتوافقة
تعتمد واجهة برمجة التطبيقات العالية السرعة في CameraX على نظام CamcorderProfile الأساسي في Android لتحديد الدقة العالية وسرعات عرض اللقطات التي يتيحها الجهاز. يتم التحقّق من صحة CamcorderProfiles من خلال مجموعة أدوات اختبار التوافق (CTS) لنظام التشغيل Android، ما يعني أنّه يمكنك الوثوق بإمكانات تسجيل الفيديو التي يوفّرها الجهاز.
وهذا يعني أنّ قدرة الجهاز على تسجيل فيديو بالحركة البطيئة باستخدام تطبيق الكاميرا المدمَج لا تضمن عمل واجهة برمجة التطبيقات عالية السرعة في CameraX. يحدث هذا التناقض لأنّ الشركات المصنّعة للأجهزة هي المسؤولة عن ملء إدخالات CamcorderProfile في البرامج الثابتة لأجهزتها، وفي بعض الأحيان لا يتم تضمين ملفات تعريف عالية السرعة ضرورية، مثل CamcorderProfile.QUALITY_HIGH_SPEED_1080P وCamcorderProfile.QUALITY_HIGH_SPEED_720P. في حال عدم توفّر هذه الملفات الشخصية، ستعرض Recorder.getHighSpeedVideoCapabilities() القيمة null.
لذلك، من الضروري استخدام Recorder.getHighSpeedVideoCapabilities() دائمًا للتحقّق من الميزات المتوافقة آليًا، لأنّ هذه هي الطريقة الأكثر موثوقية لضمان تجربة متسقة على جميع الأجهزة المختلفة. إذا حاولت ربط HighSpeedVideoSessionConfig بجهاز يعرض فيه Recorder.getHighSpeedVideoCapabilities() القيمة null، ستفشل العملية مع ظهور IllegalArgumentException. يمكنك التأكّد من توفّر هذه الميزة على أجهزة Google Pixel، لأنّها تتضمّن باستمرار ملفات تعريف عالية السرعة. بالإضافة إلى ذلك، تتوافق أجهزة مختلفة من شركات مصنّعة أخرى، مثل Motorola Edge 30 وOPPO Find N2 Flip وSony Xperia 1 V، مع إمكانات الفيديو العالي السرعة.
الخاتمة
تتسم واجهة برمجة التطبيقات الخاصة بتسجيل الفيديو عالي السرعة في CameraX بالقوة والمرونة. سواء كنت بحاجة إلى لقطات بمعدّل لقطات مرتفع جدًا لإجراء تحليل فني أو أردت إضافة تأثيرات سينمائية بالحركة البطيئة إلى تطبيقك، يوفّر لك HighSpeedVideoSessionConfig حلاً موحّدًا وبسيطًا. من خلال فهم دور العلامة setSlowMotionEnabled، يمكنك بسهولة دعم كلتا حالتي الاستخدام ومنح المستخدمين المزيد من التحكّم الإبداعي.
-
طرق التنفيذتم إصدار Media3 1.11. يوفّر هذا الإصدار ميزات جديدة وإصلاحات للأخطاء وتحسينات في التشغيل والتعديل ومكوّنات واجهة المستخدم، وهو يتيح تشغيل معظم تطبيقات الوسائط الرائجة على Android.
Toni Heidenreich • يستغرق الاطِّلاع على المقال 3 دقائق -
طرق التنفيذمرحبًا بك مجددًا في سلسلة منشورات المدونة "إنشاء تطبيقات Android ذكية"، حيث نأخذ تطبيق Android أساسيًا ونحوّله إلى تجربة مخصّصة وذكية واستباقية. في مشاركتنا السابقة، قدّمنا Jetpacker، وهو تطبيق تجريبي سنستخدمه في هذه السلسلة.
Caren Chang • يستغرق الاطّلاع على المقال 6 دقائق -
طرق التنفيذJetpacker هو تطبيق استعراضي تقني أنشأه فريقنا من البداية خصيصًا لمؤتمر Google I/O لهذا العام (تم إنشاؤه باستخدام Antigravity). يساعد تطبيق Jetpacker المستخدمين في التخطيط لمغامرتهم الكبيرة التالية واستكشافها والاستمتاع بها.
Jolanda Verhoef • مدّة القراءة: 4 دقائق
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android في بريدك الوارد أسبوعيًا.