Android Academy · บทเรียน

การบันทึกวิดีโอ

บันทึกวิดีโอด้วย CameraX

บทเรียน 4 จาก 413 ขั้นตอน

การบันทึกวิดีโอ เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

การบันทึกวิดีโอด้วย CameraX

CameRX บันทึกวิดีโอผ่าน use case VideoCapture ซึ่งทำงานอยู่บน Recorder ในบทเรียนนี้ คุณจะตั้งค่าการถ่ายวิดีโอ เริ่มและหยุดการบันทึก และบันทึกวิดีโอลงแกลเลอรี รวมถึงเสียงด้วย

ลำดับการทำงานคล้ายกับการถ่ายรูป แต่เพิ่มเซสชัน Recording ที่ทำงานต่อเนื่องเป็นเวลานาน ซึ่งคุณเริ่มและหยุดในภายหลัง

ตัวบันทึกและคุณภาพ

ขั้นแรกให้สร้าง Recorder ซึ่งกำหนดการเข้ารหัสและคุณภาพ QualitySelector ช่วยให้คุณขอคุณภาพเป้าหมาย (เช่น HD, FHD) พร้อมทางเลือกสำรอง หากอุปกรณ์ไม่สามารถให้คุณภาพนั้นได้

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

การสร้าง VideoCapture

ห่อ Recorder ไว้ใน use case VideoCapture ด้วยโรงงาน withOutput ออบเจ็กต์นี้คือสิ่งที่คุณนำไปผูกกับกล้อง เช่นเดียวกับ ImageCapture

val videoCapture = VideoCapture.withOutput(recorder)

การผูกตัวอย่างภาพกับ VideoCapture

ผูกตัวอย่างภาพและ VideoCapture เข้าด้วยกัน โปรดทราบว่าอุปกรณ์หลายรุ่นไม่สามารถผูก ImageCapture และ VideoCapture พร้อมกันได้ ดังนั้นให้เลือก use case ตามที่หน้าจอของคุณต้องการ

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 — การบันทึกเริ่มขึ้นแล้ว (อัปเดต UI ให้เป็นปุ่มหยุด)
  • 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()

UI ของ Compose สำหรับการบันทึก

ขับเคลื่อน UI ด้วยสถานะ ติดตามว่ามีการบันทึกที่กำลังทำงานอยู่หรือไม่ แล้วเปลี่ยนไอคอนและการทำงานของปุ่มให้เหมาะสม เนื่องจากตัวรับฟังทำงานบนตัวประมวลผลหลัก คุณจึงอัปเดตสถานะของ 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 จบแล้ว — ตอนนี้ชุดเครื่องมือของคุณมีทั้งตัวอย่างภาพ การถ่ายรูป และวิดีโอ

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
36
บทเรียน
152

คำถามที่พบบ่อย

บทเรียน “การบันทึกวิดีโอ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การบันทึกวิดีโอ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การบันทึกวิดีโอ”

บันทึกวิดีโอด้วย CameraX คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การบันทึกวิดีโอ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวม CameraX
  2. การแสดงตัวอย่างจากกล้อง
  3. การถ่ายภาพ
  4. การบันทึกวิดีโอ
← กลับไปที่ Android Academy