Berita Produk

Memperkenalkan CameraX 1.5: Perekaman Video yang Andal 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 mengambil video gerak lambat atau kecepatan frame tinggi yang menakjubkan. Yang lebih penting lagi, 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 sisi 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 menggunakan Ekstensi Kamera yang andal.

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

Perekaman Video yang Andal: 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 mengambil video berkecepatan tinggi (misalnya, 120 atau 240 fps) dan mengenkodenya langsung ke dalam video gerak lambat yang dramatis. Atau, Anda dapat merekam pada kecepatan frame tinggi yang sama untuk menghasilkan video yang sangat halus.

Penerapannya mudah jika Anda memahami VideoCapture API.

1. Periksa Dukungan Kecepatan Tinggi: Gunakan metode Recorder.getHighSpeedVideoCapabilities() baru untuk menanyakan 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 menanyakan rentang kecepatan frame yang didukung melalui cameraInfo.getSupportedFrameRateRanges() dan menetapkan rentang yang diinginkan. Panggil setSlowMotionEnabled(true) untuk merekam video gerak lambat, jika tidak, video akan merekam video kecepatan frame tinggi. Langkah terakhir adalah menggunakan Recorder.prepareRecording().start() reguler 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 kecepatan tinggi memerlukan dukungan CameraConstrainedHighSpeedCaptureSession dan CamcorderProfile tertentu. Selalu lakukan pemeriksaan kemampuan, dan aktifkan perekaman kecepatan tinggi hanya pada 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.

Gabungkan Fitur dengan Percaya Diri: Feature Group API

CameraX 1.5 memperkenalkan Feature Group API, yang menghilangkan tebakan kompatibilitas fitur. Berdasarkan API kueri kombinasi fitur Android 15, Anda kini dapat mengaktifkan beberapa fitur secara bersamaan dengan percaya diri, sehingga menjamin sesi kamera yang stabil. Feature Group 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 di masa mendatang direncanakan untuk menyertakan perekaman 4K dan zoom ultrawide. 

Feature Group API memungkinkan dua kasus penggunaan penting:

Kasus Penggunaan 1: Memprioritaskan Kualitas Terbaik

Jika ingin mengambil gambar 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 ini:

  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 Menghadap Pengguna

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

unsupported-features-disabled.gif

Untuk menentukan apakah akan mengaktifkan tombol, 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 dinonaktifkan 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 Feature Group untuk mengetahui informasi selengkapnya. 

Peningkatan Video Lainnya

  • Peningkatan Kamera Serentak: Dengan CameraX 1.5.1, Anda kini dapat mengikat 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.
  • Pembisuan Dinamis: Anda kini dapat memulai perekaman dalam status dibisukan menggunakan PendingRecording.withAudioEnabled(boolean initialMuted) dan mengizinkan pengguna untuk mengaktifkan suara nanti menggunakan Recording.mute(boolean muted).
  • Penanganan Penyimpanan Tidak Cukup yang Ditingkatkan: CameraX kini mengirimkan error VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE dengan andal, sehingga memungkinkan aplikasi Anda menangani situasi penyimpanan rendah dengan baik dan memberi tahu pengguna.
  • Peningkatan Cahaya Rendah: Di perangkat yang didukung (seperti seri Pixel 10), Anda dapat mengaktifkan CameraControl.enableLowLightBoostAsync untuk otomatis menerangkan pratinjau dan aliran video di lingkungan gelap.

Pengambilan Gambar Tingkat Profesional

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

Bebaskan Kontrol Kreatif dengan Pengambilan Gambar DNG (RAW)

Untuk kontrol penuh atas pascapemrosesan, CameraX kini mendukung pengambilan gambar DNG (RAW). Hal ini memberi Anda akses ke data gambar yang tidak diproses dan tidak dikompresi langsung dari sensor kamera, sehingga memungkinkan pengeditan dan penilaian warna tingkat profesional. API mendukung pengambilan gambar file DNG saja, atau pengambilan gambar output JPEG dan DNG secara bersamaan. Lihat kode contoh di bawah untuk mengetahui cara mengambil gambar 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 hal tersebut: fotografi komputasional yang menakjubkan dari Ekstensi Kamera (seperti Mode Malam) yang dikombinasikan dengan warna yang 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 API Inti dan Kegunaan

Cara Baru untuk Mengonfigurasi: SessionConfig

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

  1. Tidak Ada Lagi Panggilan unbind() Manual: CameraX API mendukung siklus proses. API ini akan secara implisit “melepas” kasus penggunaan Anda saat aktivitas atau LifecycleOwner lainnya dihancurkan. Namun, mengupdate kasus penggunaan atau mengganti kamera masih mengharuskan Anda memanggil unbind() atau unbindAll() sebelum mengikat ulang. Sekarang dengan CameraX 1.5, saat Anda mengikat SessionConfig baru, CameraX akan mengupdate sesi untuk Anda dengan lancar, sehingga tidak perlu melakukan panggilan unbind.
  2. Kontrol Kecepatan Frame Deterministik: SessionConfig API baru memperkenalkan cara deterministik untuk mengelola kecepatan frame. Tidak seperti setTargetFrameRate sebelumnya, yang hanya merupakan 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 menentukan rentang yang didukung secara akurat berdasarkan konfigurasi streaming.

Camera-Compose Kini Stabil

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

Peningkatan ImageAnalysis dan CameraControl

  • Penyesuaian Kekuatan Senter: Dapatkan kontrol yang lebih mendetail atas senter perangkat dengan API baru. Anda dapat membuat kueri 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 hari ini dan jelajahi fitur baru yang menarik. Kami tidak sabar untuk melihat apa yang Anda buat.

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 dependensi ini ke 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 dengan grup diskusi developer CameraX atau ajukan laporan bug:

Ditulis oleh:

Lanjutkan membaca