Panduan

Pengambilan Gambar Berkecepatan Tinggi dan Video Gerak Lambat dengan CameraX 1.5

Waktu baca: 6 menit
Melihat profil Charles Munger
Leo Huang Software Engineer

Merekam aksi yang bergerak cepat dengan jelas adalah fitur utama untuk aplikasi kamera modern. Hal ini dicapai melalui pengambilan gambar berkecepatan tinggi—proses pengambilan frame dengan kecepatan seperti 120 atau 240 fps. Pengambilan gambar dengan fidelitas tinggi ini dapat digunakan untuk dua tujuan berbeda: membuat video berkecepatan frame tinggi untuk analisis mendetail frame demi frame, atau membuat video gerak lambat yang menampilkan aksi secara dramatis di layar.

Sebelumnya, penerapan fitur ini dengan Camera2 API adalah proses yang lebih praktis. Sekarang, dengan API berkecepatan tinggi baru di CameraX 1.5, seluruh proses disederhanakan, sehingga Anda dapat membuat video berkecepatan frame tinggi yang sebenarnya atau klip gerak lambat yang siap diputar. Postingan ini akan menunjukkan cara menguasai keduanya. Bagi yang baru menggunakan CameraX, Anda dapat mempelajari Ringkasan CameraX.


Prinsip di Balik Gerak Lambat

Prinsip dasar gerak lambat adalah merekam video dengan kecepatan frame yang jauh lebih tinggi daripada kecepatan pemutarannya. Misalnya, jika Anda merekam peristiwa satu detik dengan kecepatan 120 frame per detik (fps) , lalu memutar rekaman tersebut dengan kecepatan 30 fps standar, video akan diputar selama empat detik. "Peregangan" waktu inilah yang menciptakan efek gerak lambat yang dramatis, sehingga Anda dapat melihat detail yang terlalu cepat untuk dilihat dengan mata telanjang.

Untuk memastikan video output akhir lancar dan mulus, video tersebut biasanya harus dirender dengan kecepatan minimal 30 fps. Artinya, untuk membuat video gerak lambat 4x, kecepatan frame pengambilan gambar asli harus minimal 120 fps (120 fps pengambilan gambar ÷ 4 = 30 fps pemutaran).

Setelah rekaman berkecepatan frame tinggi diambil, ada dua cara utama untuk mencapai hasil yang diinginkan:

  • Gerak Lambat yang Ditangani Pemutar (Video Berkecepatan Frame Tinggi): Rekaman berkecepatan tinggi (misalnya, 120 fps) disimpan langsung sebagai file video berkecepatan frame tinggi. Kemudian, pemutar video bertanggung jawab untuk memperlambat kecepatan pemutaran. Hal ini memberi pengguna fleksibilitas untuk beralih antara pemutaran normal dan gerak lambat.
  • Gerak Lambat yang Siap Diputar (Video yang Di-encode Ulang): Streaming video berkecepatan tinggi diproses dan di-encode ulang menjadi file dengan kecepatan frame standar (misalnya, 30 fps). Efek gerak lambat "ditanamkan" dengan menyesuaikan stempel waktu frame. Video yang dihasilkan akan diputar dalam gerak lambat di pemutar video standar mana pun tanpa penanganan khusus. Meskipun video diputar dalam gerak lambat secara default, pemutar video tetap dapat menyediakan kontrol kecepatan pemutaran yang memungkinkan pengguna meningkatkan kecepatan dan menonton video dengan kecepatan aslinya.

CameraX API menyederhanakan hal ini dengan memberi Anda cara terpadu untuk memilih pendekatan yang diinginkan, seperti yang akan Anda lihat di bawah.


API Video Berkecepatan Tinggi Baru

Solusi CameraX baru ini dibuat berdasarkan dua komponen utama:

  • Recorder#getHighSpeedVideoCapabilities(CameraInfo): Metode ini memungkinkan Anda memeriksa apakah kamera dapat merekam dalam kecepatan tinggi dan, jika ya, resolusi (Quality object) mana yang didukung.
  • HighSpeedVideoSessionConfig: Ini adalah objek konfigurasi khusus yang mengelompokkan kasus penggunaan VideoCapture dan Preview, sehingga CameraX dapat membuat sesi kamera berkecepatan tinggi terpadu. Perhatikan bahwa meskipun streaming VideoCapture akan beroperasi pada kecepatan frame tinggi yang dikonfigurasi, streaming Pratinjau biasanya akan dibatasi ke kecepatan standar minimal 30 FPS oleh sistem kamera untuk memastikan tampilan yang lancar di layar.

Memulai

Sebelum memulai, pastikan Anda telah menambahkan dependensi CameraX yang diperlukan ke file build.gradle.kts aplikasi. Anda akan memerlukan artefak camera-video beserta library CameraX inti.

// 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")

}

Catatan tentang API Eksperimental

Perlu diperhatikan bahwa API perekaman berkecepatan tinggi saat ini bersifat eksperimental. Artinya, API tersebut dapat berubah pada rilis mendatang. Untuk menggunakannya, Anda harus ikut serta dengan menambahkan anotasi berikut ke kode Anda:

@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)

Penerapan

Penerapan untuk kedua hasil dimulai dengan langkah penyiapan yang sama. Pilihan antara membuat video berkecepatan frame tinggi atau video gerak lambat bergantung pada satu setelan.

1. Menyiapkan Pengambilan Gambar Berkecepatan Tinggi

Pertama, apa pun tujuan Anda, Anda harus mendapatkan ProcessCameraProvider, memeriksa kemampuan perangkat, dan membuat kasus penggunaan.

Blok kode berikut menunjukkan alur penyiapan lengkap dalam fungsi penangguhan. Anda dapat memanggil fungsi ini dari cakupan coroutine, seperti 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. Memilih Output

Sekarang, Anda memutuskan jenis video yang ingin dibuat. Kode ini akan berjalan di dalam fungsi setupCamera() suspend yang ditampilkan di atas.

Opsi A: Membuat Video Berkecepatan Frame Tinggi

Pilih opsi ini jika Anda ingin file akhir memiliki kecepatan frame tinggi (misalnya, video 120 fps).

// 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())

Opsi B: Membuat Video Gerak Lambat yang Siap Diputar

Pilih opsi ini jika Anda ingin video yang diputar dalam gerak lambat secara otomatis di pemutar video standar mana pun.

// 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())

Satu flag ini adalah kunci untuk membuat video gerak lambat yang siap diputar. Jika setSlowMotionEnabled bernilai benar (true), CameraX akan memproses streaming berkecepatan tinggi dan menyimpannya sebagai file video 30 fps standar. Kecepatan gerak lambat ditentukan oleh rasio kecepatan frame pengambilan gambar terhadap laju pemutaran standar ini.

Contoh:

  • Merekam dengan kecepatan 120 fps akan menghasilkan video yang diputar dengan kecepatan 1/4x (120 ÷ 30 = 4).
  • Merekam dengan kecepatan 240 fps akan menghasilkan video yang diputar dengan kecepatan 1/8x (240 ÷ 30 = 8).

Menyatukan Semuanya: Merekam Video

Setelah mengonfigurasi HighSpeedVideoSessionConfig dan mengikatnya ke siklus proses, langkah terakhir adalah memulai perekaman. Proses menyiapkan opsi output, memulai perekaman, dan menangani peristiwa video sama seperti proses untuk pengambilan gambar video standar.

Postingan ini berfokus pada konfigurasi berkecepatan tinggi, jadi kami tidak akan membahas proses perekaman secara mendetail. Untuk panduan lengkap tentang segala hal mulai dari menyiapkan objek FileOutputOptions atau MediaStoreOutputOptions hingga menangani callback VideoRecordEvent, lihat dokumentasi 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)

    }

Dukungan Google Foto untuk Video Gerak Lambat

Jika Anda mengaktifkan setSlowMotionEnabled(true) di CameraX, file video yang dihasilkan akan langsung dikenali dan dapat diputar sebagai gerak lambat di pemutar video standar dan aplikasi galeri. Google Foto, khususnya, menawarkan fungsi yang ditingkatkan untuk video gerak lambat ini, jika kecepatan frame pengambilan gambar adalah 120, 240, 360, 480, atau 960 fps:

  • Pengenalan UI yang Berbeda di Thumbnail: Di galeri Google Foto, video gerak lambat dapat diidentifikasi berdasarkan elemen UI tertentu, sehingga membedakannya dari video normal.
normal.png
slowmotion.png
Thumbnail video normalThumbnail video gerak lambat
  • Segmen Kecepatan yang Dapat Disesuaikan selama Pemutaran: Saat memutar video gerak lambat, Google Foto menyediakan kontrol untuk menyesuaikan bagian video mana yang diputar dengan kecepatan lambat dan bagian mana yang diputar dengan kecepatan normal, sehingga pengguna memiliki kontrol kreatif. Video yang diedit kemudian dapat diekspor sebagai file video baru menggunakan tombol Bagikan, sehingga segmen gerak lambat yang Anda tentukan akan dipertahankan.
normal2.png
slowmotion2.png
Pemutaran video normalPemutaran video gerak 
lambat dengan kontrol 
pengeditan

Catatan tentang Dukungan Perangkat

API berkecepatan tinggi CameraX mengandalkan sistem CamcorderProfile Android yang mendasarinya untuk menentukan resolusi dan kecepatan frame berkecepatan tinggi yang didukung perangkat. CamcorderProfile divalidasi oleh Android Compatibility Test Suite (CTS), yang berarti Anda dapat yakin dengan kemampuan perekaman video yang dilaporkan perangkat.

Artinya, kemampuan perangkat untuk merekam video gerak lambat dengan aplikasi kamera bawaannya tidak menjamin bahwa API berkecepatan tinggi CameraX akan berfungsi. Perbedaan ini terjadi karena produsen perangkat bertanggung jawab untuk mengisi entri CamcorderProfile di firmware perangkat mereka, dan terkadang profil berkecepatan tinggi yang diperlukan seperti CamcorderProfile.QUALITY_HIGH_SPEED_1080P dan CamcorderProfile.QUALITY_HIGH_SPEED_720P tidak disertakan. Jika profil ini tidak ada, Recorder.getHighSpeedVideoCapabilities() akan menampilkan null.

Oleh karena itu, Anda harus selalu menggunakan Recorder.getHighSpeedVideoCapabilities() untuk memeriksa fitur yang didukung secara terprogram, karena ini adalah cara paling andal untuk memastikan pengalaman yang konsisten di berbagai perangkat. Jika Anda mencoba mengikat HighSpeedVideoSessionConfig di perangkat tempat Recorder.getHighSpeedVideoCapabilities() menampilkan null, operasi akan gagal dengan IllegalArgumentException. Anda dapat mengonfirmasi dukungan di perangkat Google Pixel, karena perangkat tersebut secara konsisten menyertakan profil berkecepatan tinggi ini. Selain itu, berbagai perangkat dari produsen lain, seperti Motorola Edge 30, OPPO Find N2 Flip, dan Sony Xperia 1 V, juga mendukung kemampuan video berkecepatan tinggi.


Kesimpulan

API video berkecepatan tinggi CameraX sangat canggih dan fleksibel. Baik Anda memerlukan rekaman video berkecepatan frame tinggi yang sebenarnya untuk analisis teknis atau ingin menambahkan efek gerak lambat sinematik ke aplikasi, HighSpeedVideoSessionConfig memberikan solusi yang terpadu dan sederhana. Dengan memahami peran flag setSlowMotionEnabled, Anda dapat dengan mudah mendukung kedua kasus penggunaan dan memberi pengguna kontrol kreatif yang lebih besar.

Ditulis oleh:
Lanjutkan membaca