Berita Produk

Memperkenalkan CameraX 1.5: Perekaman Video yang Canggih dan Pengambilan Gambar Tingkat Profesional

Waktu baca: 7 menit
Scott Nien
Software Engineer

Tim CameraX dengan senang hati mengumumkan rilis versi 1.5. Update terbaru ini berfokus untuk menghadirkan kemampuan tingkat profesional ke ujung jari Anda sekaligus membuat sesi kamera lebih mudah dikonfigurasi dari sebelumnya.

Untuk perekaman video, pengguna kini dapat dengan mudah merekam video gerak lambat atau video dengan kecepatan frame tinggi yang memukau. Yang lebih penting, Feature Group API baru memungkinkan Anda mengaktifkan kombinasi kompleks seperti HDR 10-bit dan 60 FPS dengan percaya diri, sehingga memastikan hasil yang konsisten di seluruh perangkat yang didukung.

Di bagian pengambilan gambar, Anda mendapatkan fleksibilitas maksimum dengan dukungan untuk mengambil file DNG (RAW) yang tidak diproses dan tidak dikompresi. Selain itu, Anda kini dapat memanfaatkan output Ultra HDR meskipun saat menggunakan Ekstensi Kamera yang canggih.

Yang mendasari fitur ini adalah SessionConfig API baru, yang menyederhanakan penyiapan dan konfigurasi ulang kamera. Sekarang, mari kita pelajari detail fitur baru yang menarik ini.

Perekaman Video yang Canggih: Kecepatan Tinggi dan Kombinasi Fitur

CameraX 1.5 memperluas kemampuan videonya secara signifikan, sehingga memungkinkan pengalaman perekaman yang lebih kreatif dan andal.

Video Gerak Lambat & Kecepatan Frame Tinggi

Salah satu fitur yang paling dinantikan, video gerak lambat, kini tersedia. Anda kini dapat merekam video berkecepatan tinggi (misalnya, 120 atau 240 fps) dan mengenkodnya langsung menjadi video gerak lambat yang dramatis. Atau, Anda dapat merekam pada kecepatan frame tinggi yang sama untuk menghasilkan video yang sangat lancar.

Penerapannya cukup mudah jika Anda memahami VideoCapture API.

1. Periksa Dukungan Kecepatan Tinggi: Gunakan metode Recorder.getHighSpeedVideoCapabilities() baru untuk mengkueri apakah perangkat mendukung fitur ini.

  val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)

val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

if (highSpeedCapabilities == null) {
    // This camera device does not support high-speed video.
    return
}

2. Konfigurasi dan Ikat Kasus Penggunaan: Gunakan videoCapabilities yang ditampilkan (yang berisi informasi kualitas video yang didukung) untuk membuat HighSpeedVideoSessionConfig. Kemudian, Anda harus membuat kueri rentang kecepatan frame yang didukung melalui cameraInfo.getSupportedFrameRateRanges() dan menetapkan rentang yang diinginkan. Panggil setSlowMotionEnabled(true) untuk merekam video gerak lambat, atau video akan direkam dengan kecepatan frame tinggi. Langkah terakhir adalah menggunakan Recorder.prepareRecording().start() biasa untuk mulai merekam video.

  val preview = Preview.Builder().build()
val quality = highSpeedCapabilities
        .getSupportedQualities(DynamicRange.SDR).first()

val recorder = Recorder.Builder()
      .setQualitySelector(QualitySelector.from(quality)))
      .build()

val videoCapture = VideoCapture.withOutput(recorder)

val frameRateRange = cameraInfo.getSupportedFrameRateRanges(      
       HighSpeedVideoSessionConfig(videoCapture, preview)
).first()

val sessionConfig = HighSpeedVideoSessionConfig(
    videoCapture, 
    preview, 
    frameRateRange = frameRateRange, 
    // Set true for slow-motion playback, or false for high-frame-rate
    isSlowMotionEnabled = true
)

cameraProvider.bindToLifecycle(
     lifecycleOwner, cameraSelector, sessionConfig)

// Start recording slow motion videos. 
val recording = recorder.prepareRecording(context, outputOption)
      .start(executor, {})

Kompatibilitas dan Batasan

Perekaman berkecepatan tinggi memerlukan dukungan CameraConstrainedHighSpeedCaptureSession dan CamcorderProfile tertentu. Selalu lakukan pemeriksaan kemampuan, dan aktifkan perekaman kecepatan tinggi hanya di perangkat yang didukung untuk mencegah pengalaman pengguna yang buruk. Saat ini, fitur ini didukung di kamera belakang hampir semua perangkat Pixel dan model tertentu dari produsen lain.

Lihat postingan blog untuk mengetahui detail selengkapnya.

Menggabungkan Fitur dengan Keyakinan: Feature Group API

CameraX 1.5 memperkenalkan Feature Group API, yang menghilangkan tebakan tentang kompatibilitas fitur. Berdasarkan API kueri kombinasi fitur Android 15, Anda kini dapat mengaktifkan beberapa fitur secara bersamaan dengan yakin, sehingga menjamin sesi kamera yang stabil. Grup Fitur saat ini mendukung: HDR (HLG), 60 fps, Stabilisasi Pratinjau, dan Ultra HDR. Misalnya, Anda dapat mengaktifkan HDR, 60 fps, dan Stabilisasi Pratinjau secara bersamaan di seri Pixel 10 dan Galaxy S25. Peningkatan kualitas di masa mendatang direncanakan untuk mencakup perekaman 4K dan zoom ultra-wide. 

Feature Group API memungkinkan dua kasus penggunaan penting:

Kasus Penggunaan 1: Memprioritaskan Kualitas Terbaik

Jika Anda ingin merekam menggunakan kombinasi fitur terbaik, Anda dapat memberikan daftar yang diprioritaskan. CameraX akan mencoba mengaktifkannya secara berurutan, memilih kombinasi pertama yang didukung sepenuhnya oleh perangkat.

  val sessionConfig = SessionConfig(
    useCases = listOf(preview, videoCapture),
    preferredFeatureGroup = listOf(
        GroupableFeature.HDR_HLG10,
        GroupableFeature.FPS_60,
        GroupableFeature.PREVIEW_STABILIZATION
    )
).apply {
    // (Optional) Get a callback with the enabled features to update your UI.
    setFeatureSelectionListener { selectedFeatures ->
        updateUiIndicators(selectedFeatures)
    }
}
processCameraProvider.bindToLifecycle(activity, cameraSelector, sessionConfig)

Dalam contoh ini, CameraX mencoba mengaktifkan fitur dalam urutan berikut:

  1. HDR + 60 FPS + Stabilisasi Pratinjau
  2. HDR + 60 FPS
  3. HDR + Stabilisasi Pratinjau
  4. HDR
  5. 60 FPS + Stabilisasi Pratinjau
  6. 60 FPS
  7. Stabilisasi Pratinjau
  8. Tidak ada

Kasus Penggunaan 2: Membuat UI Setelan yang Ditampilkan kepada Pengguna

Sekarang Anda dapat secara akurat mencerminkan kombinasi fitur mana yang didukung di UI setelan aplikasi Anda, dengan menonaktifkan tombol untuk opsi yang tidak didukung seperti gambar di bawah. 

unsupported-features-disabled.gif

Untuk menentukan apakah tombol harus berwarna abu-abu, gunakan kode berikut untuk memeriksa dukungan kombinasi fitur. Awalnya, kueri status setiap fitur. Setelah fitur diaktifkan, kueri ulang fitur yang tersisa dengan fitur yang diaktifkan untuk melihat apakah tombolnya sekarang harus berwarna abu-abu karena batasan kompatibilitas.

  fun disableFeatureIfNotSuported(
   enabledFeatures: Set<GroupableFeature>,     
   featureToCheck:GroupableFeature
) {
 val sessionConfig = SessionConfig(
     useCases = useCases,
     requiredFeatureGroup = enabledFeatures + featureToCheck
 )
 val isSupported = cameraInfo.isFeatureGroupSupported(sessionConfig)

 if (!isSupported) {
     // disable the toggle for featureToCheck
 }
}

Lihat postingan blog Grup Fitur untuk mengetahui informasi selengkapnya. 

Peningkatan Kualitas Video Lainnya

  • Peningkatan Kamera Serentak: Dengan CameraX 1.5.1, Anda kini dapat menggabungkan kasus penggunaan Pratinjau + ImageCapture + VideoCapture secara serentak untuk setiap SingleCameraConfig dalam mode non-komposisi. Selain itu, dalam mode komposisi (kasus penggunaan yang sama dengan CompositionSettings),  Anda kini dapat menetapkan CameraEffect yang diterapkan ke hasil komposisi akhir.
  • Peredaman Suara Dinamis: Anda kini dapat memulai perekaman dalam keadaan tanpa suara menggunakan PendingRecording.withAudioEnabled(boolean initialMuted) dan mengizinkan pengguna untuk menyuarakan nanti menggunakan Recording.mute(boolean muted).
  • Penanganan Penyimpanan Tidak Cukup yang Lebih Baik: CameraX kini mengirimkan error VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE dengan andal, sehingga aplikasi Anda dapat menangani situasi penyimpanan rendah dengan baik dan memberi tahu pengguna.
  • Peningkatan Cahaya Redup: Di perangkat yang didukung (seperti seri Pixel 10), Anda dapat mengaktifkan CameraControl.enableLowLightBoostAsync untuk otomatis mencerahkan pratinjau dan streaming video di lingkungan gelap.

Pengambilan Gambar Tingkat Profesional

CameraX 1.5 menghadirkan upgrade besar pada ImageCapture bagi developer yang menginginkan kualitas dan fleksibilitas maksimum.

Mengekspresikan Kreativitas dengan Pengambilan DNG (RAW)

Untuk kontrol penuh atas pascapemrosesan, CameraX kini mendukung pengambilan gambar DNG (RAW). Hal ini memberi Anda akses ke data gambar yang belum diproses dan tidak dikompresi langsung dari sensor kamera, sehingga memungkinkan pengeditan dan gradasi warna tingkat profesional. API ini mendukung pengambilan file DNG saja, atau pengambilan output JPEG dan DNG secara bersamaan. Lihat contoh kode di bawah untuk mengetahui cara mengambil file JPEG dan DNG secara bersamaan.

  val capabilities = ImageCapture.getImageCaptureCapabilities(cameraInfo)
val imageCapture = ImageCapture.Builder().apply {
    if (capabilities.supportedOutputFormats
             .contains(OUTPUT_FORMAT_RAW_JPEG)) {
        // Capture both RAW and JPEG formats.
        setOutputFormat(OUTPUT_FORMAT_RAW_JPEG)
    }
}.build()
// ... bind imageCapture to lifecycle ...


// Provide separate output options for each format.
val outputOptionRaw = /* ... configure for image/x-adobe-dng ... */
val outputOptionJpeg = /* ... configure for image/jpeg ... */
imageCapture.takePicture(
    outputOptionRaw,
    outputOptionJpeg,
    executor,
    object : ImageCapture.OnImageSavedCallback {
        override fun onImageSaved(results: OutputFileResults) {
            // This callback is invoked twice: once for the RAW file
            // and once for the JPEG file.
        }

        override fun onError(exception: ImageCaptureException) {}
    }
)

Ultra HDR untuk Ekstensi Kamera

Dapatkan yang terbaik dari kedua dunia: fotografi komputasional yang memukau dari Ekstensi Kamera (seperti Mode Malam) yang dipadukan dengan warna cemerlang dan rentang dinamis Ultra HDR. Fitur ini kini didukung di banyak ponsel Android premium terbaru, seperti seri Pixel 9/10 dan seri Samsung S24/S25.

  // Support UltraHDR when Extension is enabled. 

val extensionsEnabledCameraSelector = extensionsManager
     .getExtensionEnabledCameraSelector(
        CameraSelector.DEFAULT_BACK_CAMERA, ExtensionMode.NIGHT)

val imageCapabilities = ImageCapture.getImageCaptureCapabilities(
               cameraProvider.getCameraInfo(extensionsEnabledCameraSelector)

val imageCapture = ImageCapture.Builder()
     .apply {
       if (imageCapabilities.supportedOutputFormats
                .contains(OUTPUT_FORMAT_JPEG_ULTRA_HDR) {
           setOutputFormat(OUTPUT_FORMAT_JPEG_ULTRA_HDR)

       }

     }.build()

Peningkatan Kegunaan dan API Inti

Cara Baru untuk Mengonfigurasi: SessionConfig

Seperti yang terlihat pada contoh di atas, SessionConfig adalah konsep baru di CameraX 1.5. Hal ini memusatkan konfigurasi dan menyederhanakan API dalam dua cara utama:

  1. Tidak Ada Lagi Panggilan unbind() Manual: API CameraX mendukung siklus proses. Hal ini akan secara implisit “melepaskan” kasus penggunaan Anda saat aktivitas atau LifecycleOwner lainnya dihapus. Namun, memperbarui kasus penggunaan atau mengganti kamera tetap mengharuskan Anda memanggil unbind() atau unbindAll() sebelum melakukan pengikatan ulang. Sekarang dengan CameraX 1.5, saat Anda mengikat SessionConfig baru, CameraX akan memperbarui sesi dengan lancar untuk Anda, sehingga tidak perlu melakukan panggilan pelepasan ikatan.
  2. Kontrol Kecepatan Frame Deterministik: API SessionConfig baru memperkenalkan cara deterministik untuk mengelola kecepatan frame. Tidak seperti setTargetFrameRate sebelumnya, yang hanya berupa petunjuk, metode baru ini menjamin rentang kecepatan frame yang ditentukan akan diterapkan setelah konfigurasi berhasil. Untuk memastikan akurasi, Anda harus membuat kueri kecepatan frame yang didukung menggunakan CameraInfo.getSupportedFrameRateRanges(SessionConfig). Dengan meneruskan SessionConfig lengkap, CameraX dapat secara akurat menentukan rentang yang didukung berdasarkan konfigurasi streaming.

Camera-Compose Kini Stabil

Kami tahu betapa Anda menikmati Jetpack Compose, dan dengan senang hati kami mengumumkan bahwa library camera-compose kini stabil di versi 1.5.1! Rilis ini mencakup perbaikan bug penting terkait penggunaan CameraXViewfinder dengan fitur Compose seperti moveableContentOf dan Pager, serta menyelesaikan masalah peregangan pratinjau. Kami akan terus menambahkan lebih banyak fitur ke camera-compose dalam rilis mendatang.

Peningkatan ImageAnalysis dan CameraControl

  • Penyesuaian Intensitas Senter: Dapatkan kontrol terperinci atas senter perangkat dengan API baru. Anda dapat mengkueri kekuatan maksimum yang didukung menggunakan CameraInfo.getMaxTorchStrengthLevel(), lalu menetapkan tingkat yang diinginkan dengan CameraControl.setTorchStrengthLevel().
  • Dukungan NV21 di ImageAnalysis: Anda kini dapat meminta format gambar NV21 langsung dari ImageAnalysis, sehingga menyederhanakan integrasi dengan library dan API lainnya. Hal ini diaktifkan dengan memanggil ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21).

Mulai Sekarang Juga

Update dependensi Anda ke CameraX 1.5 sekarang dan jelajahi fitur baru yang menarik. Kami menantikan karya Anda.

Untuk menggunakan CameraX 1.5,  tambahkan dependensi berikut ke libs.versions.toml. (Sebaiknya gunakan 1.5.1 yang berisi banyak perbaikan bug penting dan peningkatan kamera serentak.) 

  [versions]

camerax = "1.5.1"


[libraries]

..

androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }

androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }

androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" }

androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }

androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }

androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" }

Kemudian, tambahkan ini ke dependensi build.gradle.kts modul Anda:

  dependencies {

  ..

  implementation(libs.androidx.camera.core)
  implementation(libs.androidx.camera.lifecycle)

  implementation(libs.androidx.camera.camera2)

  implementation(libs.androidx.camera.view) // for PreviewView 
  implementation(libs.androidx.camera.compose) // for compose UI

  implementation(libs.androidx.camera.extensions) // For Extensions 

}

Ada pertanyaan atau ingin terhubung dengan tim CameraX? Bergabunglah ke grup diskusi developer CameraX atau ajukan laporan bug:

Ditulis oleh:

Lanjutkan membaca