إنّ تسجيل الأحداث السريعة بوضوح هو ميزة أساسية لتطبيقات الكاميرا الحديثة. ويتم تحقيق ذلك من خلال التصوير عالي السرعة، أي عملية تسجيل اللقطات بمعدّلات مثل 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): تتيح لك هذه الطريقة التحقّق مما إذا كان بإمكان الكاميرا التسجيل بسرعة عالية، وإذا كان الأمر كذلك، ما هي درجات الدقة (Qualityobjects) المتوافقة.HighSpeedVideoSessionConfig: هذا كائن إعداد خاص يجمع بين حالات استخدامVideoCaptureوPreview، ويطلب من CameraX إنشاء جلسة موحّدة للكاميرا عالية السرعة. يُرجى العِلم أنّه على الرغم من أنّ بث VideoCapture سيعمل بمعدّل عدد اللقطات في الثانية المرتفع الذي تم ضبطه، فإنّ معدّل بث Preview سيقتصر عادةً على معدّل عادي يبلغ 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/4 من السرعة (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، يمكنك بسهولة دعم كلتا حالتَي الاستخدام ومنح المستخدمين تحكّمًا إبداعيًا أكبر.
متابعة القراءة
-
مقالات إرشادية
يسرّنا اليوم الإعلان عن بيانات اعتماد جديدة للبريد الإلكتروني تم التحقّق من صحتها وصادرة عن Google، ويمكن للمطوّرين الآن استردادها مباشرةً من واجهة برمجة التطبيقات Digital Credential API في Credential Manager على Android.
Niharika Arora, Jean-Pierre Pralle • 3 دقائق للقراءة
-
مقالات إرشادية
سواء كنت تستخدم Gemini في "استوديو Android" أو Gemini CLI أو Antigravity أو وكلاء تابعين لجهات خارجية مثل Claude Code أو Codex، فإنّ مهمتنا هي ضمان إمكانية تطوير تطبيقات Android عالية الجودة في كل مكان.
Adarsh Fernando, Esteban de la Canal • 4 دقائق للقراءة
-
مقالات إرشادية
إدراكًا منّا أنّ استنزاف البطارية بشكل مفرط هو أوّل ما يخطر في بال مستخدمي Android، اتّخذت Google خطوات مهمة لمساعدة المطوّرين في إنشاء تطبيقات أكثر كفاءة في استهلاك الطاقة.
Alice Yuan • 8 دقائق للقراءة
البقاء على اطّلاع على آخر التحديثات
يمكنك تلقّي أحدث الإحصاءات حول تطوير تطبيقات Android أسبوعيًا في بريدك الوارد.