Petunjuk
Perekaman Berkecepatan Tinggi dan Video Gerak Lambat dengan CameraX 1.5
Waktu baca: 6 menit
Merekam aksi yang bergerak cepat dengan jelas adalah fitur utama untuk aplikasi kamera modern. Hal ini dicapai melalui perekaman kecepatan tinggi—proses pengambilan frame pada kecepatan seperti 120 atau 240 fps. Perekaman dengan fidelitas tinggi ini dapat digunakan untuk dua tujuan berbeda: membuat video dengan kecepatan 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 dengan kecepatan frame tinggi yang sebenarnya atau klip slow motion 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 pada kecepatan frame yang jauh lebih tinggi daripada kecepatan pemutarannya. Misalnya, jika Anda merekam peristiwa satu detik pada 120 frame per detik (fps), lalu memutar rekaman tersebut pada 30 fps standar, video akan membutuhkan waktu empat detik untuk diputar. "Peregangan" waktu inilah yang menciptakan efek gerak lambat yang dramatis, sehingga Anda dapat melihat detail yang terlalu cepat untuk mata telanjang.
Untuk memastikan video output akhir lancar dan mulus, video tersebut biasanya harus dirender 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 merekam rekaman video dengan kecepatan frame tinggi, ada dua cara utama untuk mencapai hasil yang diinginkan:
- Gerak Lambat yang Ditangani Pemutar (Video Kecepatan Frame Tinggi): Perekaman kecepatan tinggi (misalnya, 120 fps) disimpan langsung sebagai file video kecepatan frame tinggi. Kemudian, pemutar video bertanggung jawab untuk memperlambat kecepatan pemutaran. Hal ini memberikan fleksibilitas kepada pengguna untuk beralih antara pemutaran normal dan gerak lambat.
- Video Gerak Lambat Siap Diputar (Video yang Dienkode Ulang): Aliran video berkecepatan tinggi diproses dan dienkode 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 menyederhanakannya dengan memberi Anda cara terpadu untuk memilih pendekatan yang diinginkan, seperti yang akan Anda lihat di bawah.
High-Speed Video API Baru
Solusi CameraX baru dibangun di atas dua komponen utama:
Recorder#getHighSpeedVideoCapabilities(CameraInfo): Metode ini memungkinkan Anda memeriksa apakah kamera dapat merekam dalam kecepatan tinggi dan, jika ya, resolusi mana (objekQuality) yang didukung.HighSpeedVideoSessionConfig: Ini adalah objek konfigurasi khusus yang mengelompokkan kasus penggunaanVideoCapturedanPreviewAnda, yang memberi tahu CameraX untuk membuat sesi kamera berkecepatan tinggi yang terpadu. Perhatikan bahwa meskipun streaming VideoCapture akan beroperasi pada kecepatan frame tinggi yang dikonfigurasi, streaming Pratinjau biasanya akan dibatasi pada 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. Anda akan memerlukan artefak camera-video beserta library inti 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") }
Catatan tentang API Eksperimental
Penting untuk diperhatikan bahwa API perekaman kecepatan tinggi saat ini bersifat eksperimental. Artinya, API tersebut dapat berubah dalam rilis mendatang. Untuk menggunakannya, Anda harus memilih ikut serta dengan menambahkan anotasi berikut ke kode Anda:
@kotlin.OptIn(ExperimentalSessionConfig::class, ExperimentalHighSpeedVideo::class)
Implementasi
Implementasi untuk kedua hasil dimulai dengan langkah penyiapan yang sama. Pilihan antara membuat video dengan kecepatan frame tinggi atau video gerak lambat bergantung pada satu setelan.
1. Menyiapkan Pengambilan Gambar Kecepatan 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 suspend. 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 Anda
Sekarang, Anda memutuskan jenis video yang ingin Anda buat. Kode ini akan berjalan di dalam fungsi setupCamera() suspend yang ditampilkan di atas.
Opsi A: Membuat Video dengan Kecepatan Frame Tinggi
Pilih opsi ini jika Anda ingin file akhir memiliki kecepatan frame yang 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 Siap Diputar
Pilih opsi ini jika Anda ingin video yang diputar dalam gerakan 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 tanda ini adalah kunci untuk membuat video gerak lambat yang siap diputar. Jika setSlowMotionEnabled bernilai benar (true), CameraX akan memproses aliran kecepatan tinggi dan menyimpannya sebagai file video 30 fps standar. Kecepatan gerak lambat ditentukan oleh rasio kecepatan frame pengambilan terhadap kecepatan pemutaran standar ini.
Contoh:
- Merekam pada 120 fps akan menghasilkan video yang diputar kembali dengan kecepatan 1/4x (120 ÷ 30 = 4).
- Merekam pada 240 fps akan menghasilkan video yang diputar pada kecepatan 1/8x (240 ÷ 30 = 8).
Menyatukan Semuanya: Merekam Video
Setelah Anda mengonfigurasi HighSpeedVideoSessionConfig dan mengikatnya ke siklus proses, langkah terakhir adalah memulai perekaman. Proses menyiapkan opsi output, memulai perekaman, dan menangani peristiwa video sama seperti pada perekaman video standar.
Postingan ini berfokus pada konfigurasi kecepatan tinggi, jadi kami tidak akan membahas proses perekaman secara mendetail. Untuk panduan komprehensif 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
Saat Anda mengaktifkan setSlowMotionEnabled(true) di CameraX, file video yang dihasilkan dirancang agar dapat langsung dikenali dan diputar sebagai video gerak lambat di pemutar video standar dan aplikasi galeri. Khususnya, Google Foto menawarkan fungsi yang ditingkatkan untuk video gerak lambat ini, saat kecepatan frame pengambilan adalah 120, 240, 360, 480, atau 960 fps:
- Pengenalan UI yang Berbeda dalam Thumbnail: Di galeri Google Foto Anda, video gerak lambat dapat diidentifikasi berdasarkan elemen UI tertentu, sehingga membedakannya dari video normal.
- 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 telah diedit kemudian dapat diekspor sebagai file video baru menggunakan tombol Bagikan, dengan mempertahankan segmen gerak lambat yang Anda tentukan.
Catatan tentang Dukungan Perangkat
API kecepatan tinggi CameraX mengandalkan sistem CamcorderProfile Android yang mendasarinya untuk menentukan resolusi dan kecepatan frame kecepatan 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 gerakan 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 kecepatan 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 yang Recorder.getHighSpeedVideoCapabilities()-nya menampilkan null, operasi akan gagal dengan IllegalArgumentException. Anda dapat mengonfirmasi dukungan di perangkat Google Pixel, karena perangkat tersebut secara konsisten menyertakan profil kecepatan 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 dengan kecepatan frame tinggi yang sebenarnya untuk analisis teknis atau ingin menambahkan efek slow motion sinematik ke aplikasi, HighSpeedVideoSessionConfig memberikan solusi yang terpadu dan sederhana. Dengan memahami peran tanda setSlowMotionEnabled, Anda dapat dengan mudah mendukung kedua kasus penggunaan dan memberi pengguna Anda kontrol yang lebih kreatif.
Lanjutkan membaca
-
Petunjuk
Sebagai pengakuan bahwa pengurasan baterai yang berlebihan menjadi perhatian utama bagi pengguna Android, Google telah mengambil langkah-langkah signifikan untuk membantu developer membangun aplikasi yang lebih hemat daya.
Alice Yuan • Waktu baca: 8 menit
-
Petunjuk
Kami ingin memberi Anda contoh fitur yang didukung AI menggunakan model di perangkat dan Cloud, serta menginspirasi Anda untuk menciptakan pengalaman yang menyenangkan bagi pengguna Anda.
Thomas Ezan, Ivy Knight • Waktu baca: 2 menit
-
Petunjuk
Panduan penentuan tingkat performa menampilkan 5 tingkat. Kita akan mulai dengan level 1, yang memperkenalkan alat performa dengan upaya adopsi minimal, dan kita akan naik ke level 5, yang ideal untuk aplikasi yang memiliki sumber daya untuk mempertahankan framework performa khusus.
Alice Yuan • Waktu baca: 9 menit
Terus dapatkan informasi
Dapatkan insight pengembangan Android terbaru yang dikirim ke kotak masuk Anda setiap minggu.