0Pricing
Android Academy · درس

تسجيل الفيديو

التقط فيديو باستخدام CameraX

تسجيل الفيديو درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.

تسجيل الفيديو باستخدام CameraX

يسجّل CameRX الفيديو من خلال حالة الاستخدام VideoCapture المدعومة بواسطة Recorder. في هذا الدرس ستعدّون التقاط الفيديو، وتبدؤون التسجيل وتوقفونه، وتحفظونه في المعرض — مع الصوت أيضًا.

يشبه التدفق تدفق الصور، لكنه يضيف جلسة Recording طويلة الأمد تبدؤونها ثم توقفونها لاحقًا.

Recorder والجودة

تبدؤون أولًا بإنشاء Recorder، الذي يحدّد الترميز والجودة. يتيح لكم QualitySelector طلب جودة مستهدفة، مثل HD أو FHD، مع استخدام جودة بديلة إذا تعذّر على الجهاز توفيرها.

val recorder = Recorder.Builder()
    .setQualitySelector(
        QualitySelector.from(
            Quality.FHD,
            FallbackStrategy.lowerQualityOrHigherThan(Quality.SD)
        )
    )
    .build()

إنشاء VideoCapture

غلّفوا Recorder داخل حالة استخدام VideoCapture باستخدام مصنع withOutput. هذا هو الكائن الذي تربطونه بالكاميرا، تمامًا كما تفعلون مع ImageCapture.

val videoCapture = VideoCapture.withOutput(recorder)

ربط Preview وVideoCapture

اربطوا المعاينة وVideoCapture معًا. لاحظوا أن العديد من الأجهزة لا تسمح بربط ImageCapture وVideoCapture في الوقت نفسه، لذا اختاروا حالات الاستخدام التي تحتاج إليها شاشتكم.

cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
    lifecycleOwner,
    CameraSelector.DEFAULT_BACK_CAMERA,
    preview,
    videoCapture
)

إذن الصوت

لتسجيل الصوت، تحتاجون إلى إذن وقت التشغيل RECORD_AUDIO بالإضافة إلى CAMERA. اطلبوا الإذنين قبل بدء التسجيل، ولا تفعّلوا الصوت إلا إذا منحه المستخدم.

// Manifest declares both:
// <uses-permission android:name="android.permission.CAMERA" />
// <uses-permission android:name="android.permission.RECORD_AUDIO" />

val audioGranted = ContextCompat.checkSelfPermission(
    context, Manifest.permission.RECORD_AUDIO
) == PackageManager.PERMISSION_GRANTED

الإخراج عبر MediaStore

كما هو الحال مع الصور، احفظوا الفيديو في MediaStore باستخدام التخزين المحدد النطاق. أنشئوا ContentValues بنوع MIME هو mp4، ثم أنشئوا MediaStoreOutputOptions.

val values = ContentValues().apply {
    put(MediaStore.MediaColumns.DISPLAY_NAME, "VID_${System.currentTimeMillis()}")
    put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4")
    put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/MyApp")
}

val outputOptions = MediaStoreOutputOptions
    .Builder(context.contentResolver, MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
    .setContentValues(values)
    .build()

بدء التسجيل

جهّزوا التسجيل من المسجّل، وفعّلوا الصوت اختياريًا باستخدام withAudioEnabled()، ثم استدعوا start(). يعيد start() كائنًا من نوع Recording تحتفظون به حتى تتمكّنوا من إيقافه لاحقًا.

تمرّرون أيضًا مستمعًا يتلقى تحديثات VideoRecordEvent.

val recording = videoCapture.output
    .prepareRecording(context, outputOptions)
    .apply { if (audioGranted) withAudioEnabled() }
    .start(ContextCompat.getMainExecutor(context)) { event ->
        when (event) {
            is VideoRecordEvent.Start -> { /* recording began */ }
            is VideoRecordEvent.Finalize -> {
                if (!event.hasError()) {
                    // event.outputResults.outputUri -> saved video
                }
            }
        }
    }

الاستجابة لأحداث التسجيل

يبث المستمع دورة حياة التسجيل:

  • VideoRecordEvent.Start — بدأ التسجيل؛ حدّثوا واجهة المستخدم لعرض زر إيقاف.
  • VideoRecordEvent.Status — تحديثات دورية تتضمن مدة التسجيل وحجمه.
  • VideoRecordEvent.Finalize — انتهى التسجيل؛ تحققوا من hasError().
is VideoRecordEvent.Status -> {
    val seconds = event.recordingStats.recordedDurationNanos / 1_000_000_000
    // Update an on-screen timer.
}

إيقاف التسجيل

لإنهاء التسجيل، استدعوا stop() على كائن Recording الذي حفظتموه سابقًا. يؤدي ذلك إلى تشغيل حدث Finalize، حيث يصبح URI الفيديو متاحًا.

احتفظوا بالتسجيل النشط في الحالة حتى يتمكّن زر واحد من التبديل بين البدء والإيقاف.

var activeRecording: Recording? = null

// Toggle handler:
if (activeRecording == null) {
    activeRecording = startRecording()
} else {
    activeRecording?.stop()
    activeRecording = null
}

الإيقاف المؤقت والاستئناف

يمكن أيضًا إيقاف كائن Recording مؤقتًا واستئنافه دون إيقافه نهائيًا. يفيد ذلك في السماح للمستخدمين بضم المقاطع إلى ملف واحد.

activeRecording?.pause()
// ...later
activeRecording?.resume()
// Final stop writes the file:
activeRecording?.stop()

واجهة Compose لتسجيل الفيديو

وجّهوا واجهة المستخدم من خلال الحالة. تتبّعوا ما إذا كان التسجيل نشطًا، وبدّلوا رمز الزر وإجراءه وفقًا لذلك. وبما أن المستمع يعمل على executor الرئيسي، يمكنكم تحديث حالة Compose مباشرةً منه.

var isRecording by remember { mutableStateOf(false) }

IconButton(onClick = { toggleRecording() }) {
    Icon(
        imageVector = if (isRecording) Icons.Default.Stop else Icons.Default.Videocam,
        contentDescription = if (isRecording) "Stop" else "Record"
    )
}

تحقق سريع

تأكدوا من استيعابكم لتسجيل الفيديو باستخدام CameraX.

مراجعة

يمكنكم الآن تسجيل الفيديو باستخدام CameraX:

  • أنشئوا Recorder باستخدام QualitySelector، ثم غلّفوه داخل VideoCapture.withOutput.
  • اربطوه بالمعاينة واطلبوا RECORD_AUDIO لتسجيل الصوت.
  • احفظوا الفيديو عبر MediaStoreOutputOptions، ثم استدعوا prepareRecording().start() للحصول على كائن Recording.
  • استجيبوا لأحداث VideoRecordEvent، واستدعوا stop() لإنهاء التسجيل وقراءة URI المحفوظ.

لقد أتممتم دورة CameraX — أصبحت المعاينة والصور والفيديو جميعها ضمن أدواتكم.

الأسئلة الشائعة

هل درس «تسجيل الفيديو» مجاني؟

نعم — نص درس «تسجيل الفيديو» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.

ماذا ستتعلم في «تسجيل الفيديو»؟

التقط فيديو باستخدام CameraX تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «تسجيل الفيديو»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. نظرة عامة على CameraX
  2. عرض معاينة الكاميرا
  3. التقاط الصور
  4. تسجيل الفيديو
← العودة إلى Android Academy