Ürün Haberleri

CameraX 1.5: Güçlü video kaydı ve profesyonel düzeyde Resim Yakalama

Okuma süresi: 7 dakika
Scott Nien
Yazılım Mühendisi

CameraX ekibi, 1.5 sürümünün yayınlandığını duyurmaktan heyecan duyuyor. Bu son güncelleme, profesyonel düzeydeki özellikleri parmaklarınızın ucuna getirirken kamera oturumunu her zamankinden daha kolay yapılandırmanıza olanak tanır.

Video kaydı özelliği sayesinde kullanıcılar artık zahmetsizce etkileyici ağır çekim veya yüksek kare hızlı videolar çekebilir. Daha da önemlisi, yeni Feature Group API, 10 bit HDR ve 60 FPS gibi karmaşık kombinasyonları güvenle etkinleştirmenize olanak tanıyarak desteklenen cihazlarda tutarlı sonuçlar elde etmenizi sağlar.

Görüntü yakalama konusunda, işlenmemiş ve sıkıştırılmamış DNG (RAW) dosyalarını yakalama desteği sayesinde maksimum esneklik elde edersiniz. Ayrıca, güçlü kamera uzantılarını kullanırken bile Ultra HDR çıkışından yararlanabilirsiniz.

Bu özelliklerin temelinde, kamera kurulumunu ve yeniden yapılandırmayı kolaylaştıran yeni SessionConfig API yer alır. Şimdi bu heyecan verici yeni özelliklerin ayrıntılarına geçelim.

Güçlü video kaydı: Yüksek hızlı ve özellik kombinasyonları

CameraX 1.5, video özelliklerini önemli ölçüde genişleterek daha yaratıcı ve sağlam kayıt deneyimleri sunuyor.

Ağır çekim ve yüksek kare hızlı video

En çok beklenen özelliklerimizden biri olan ağır çekim video özelliği artık kullanıma sunuldu. Artık yüksek hızlı videolar (ör. 120 veya 240 FPS) çekip bunları doğrudan etkileyici ağır çekim videolar olarak kodlayabilirsiniz. Alternatif olarak, son derece akıcı videolar üretmek için aynı yüksek kare hızında kayıt yapabilirsiniz.

VideoCapture API'sini biliyorsanız bu işlemi uygulamak kolaydır.

1. Yüksek Hızlı Destek Kontrolü: Cihazın bu özelliği destekleyip desteklemediğini sorgulamak için yeni Recorder.getHighSpeedVideoCapabilities() yöntemini kullanın.

  val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)

val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)

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

2. Kullanım alanını yapılandırın ve bağlayın: Döndürülen videoCapabilities'u (desteklenen video kalitesi bilgilerini içerir) kullanarak HighSpeedVideoSessionConfig oluşturun. Ardından, cameraInfo.getSupportedFrameRateRanges() aracılığıyla desteklenen kare hızı aralıklarını sorgulamanız ve istediğiniz aralığı ayarlamanız gerekir. Ağır çekim videolar kaydetmek için setSlowMotionEnabled(true) işlevini çağırın. Aksi takdirde yüksek kare hızlı videolar kaydedilir. Son adım, videoyu kaydetmeye başlamak için normal Recorder.prepareRecording().start() düğmesini kullanmaktır.

  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, {})

Uyumluluk ve Sınırlamalar

Yüksek hızlı kayıt için belirli CameraConstrainedHighSpeedCaptureSession ve CamcorderProfile desteği gerekir. Kötü bir kullanıcı deneyimini önlemek için her zaman özellik kontrolü yapın ve yüksek hızlı kaydı yalnızca desteklenen cihazlarda etkinleştirin. Bu özellik şu anda neredeyse tüm Pixel cihazların arka kameralarında ve diğer üreticilerin belirli modellerinde desteklenmektedir.

Daha fazla bilgi için blog yayınını inceleyin.

Özellikleri güvenle birleştirin: Feature Group API

CameraX 1.5, özellik uyumluluğuyla ilgili tahminleri ortadan kaldıran Feature Group API'yi kullanıma sunuyor. Android 15'in özellik kombinasyonu sorgusu API'sine dayalı olarak artık birden fazla özelliği birlikte güvenle etkinleştirebilir ve kararlı bir kamera oturumu sağlayabilirsiniz. Özellik grubu şu anda HDR (HLG), 60 FPS, önizleme sabitleme ve Ultra HDR'yi desteklemektedir. Örneğin, Pixel 10 ve Galaxy S25 serisinde HDR, 60 fps ve önizleme sabitlemeyi aynı anda etkinleştirebilirsiniz. Gelecekteki geliştirmelerle 4K kayıt ve ultra geniş yakınlaştırma özelliklerinin eklenmesi planlanmaktadır. 

Özellik grubu API'si iki temel kullanım alanını destekler:

1. Kullanım Alanı: En İyi Kaliteye Öncelik Verme

Mümkün olan en iyi özellik kombinasyonunu kullanarak çekim yapmak istiyorsanız önceliklendirilmiş bir liste sağlayabilirsiniz. CameraX, cihazın tam olarak desteklediği ilk kombinasyonu seçerek bunları sırayla etkinleştirmeye çalışır.

  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)

Bu örnekte CameraX, özellikleri şu sırayla etkinleştirmeye çalışır:

  1. HDR + 60 FPS + Önizleme Sabitleme
  2. HDR + 60 FPS
  3. HDR + Önizleme Sabitleme
  4. HDR
  5. 60 FPS + Önizleme Sabitleme
  6. 60 FPS
  7. Sabitlemeyi önizleme
  8. Yok

2. Kullanım Alanı: Kullanıcıya Yönelik Ayarlar Kullanıcı Arayüzü Oluşturma

Artık uygulamanızın ayarlar kullanıcı arayüzünde hangi özellik kombinasyonlarının desteklendiğini doğru şekilde yansıtabilir ve aşağıdaki resimde gösterildiği gibi desteklenmeyen seçenekler için açma/kapatma düğmelerini devre dışı bırakabilirsiniz. 

unsupported-features-disabled.gif

Bir açma/kapatma düğmesinin devre dışı bırakılıp bırakılmayacağını belirlemek için özellik kombinasyonu desteğini kontrol etmek üzere aşağıdaki kodları kullanın. Başlangıçta her bir özelliğin durumunu sorgulayın. Bir özellik etkinleştirildikten sonra, etkinleştirilen özelliklerle birlikte kalan özellikler için yeniden sorgu göndererek uyumluluk kısıtlamaları nedeniyle artık bu özelliklerin açma/kapatma düğmelerinin devre dışı bırakılıp bırakılmaması gerektiğini kontrol edin.

  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
 }
}

Daha fazla bilgi için lütfen Özellik Grubu blog yayınını inceleyin. 

Diğer video iyileştirmeleri

  • Eşzamanlı Kamera İyileştirmeleri: CameraX 1.5.1 ile artık kompozisyon modu dışındaki her SingleCameraConfig için Önizleme + ImageCapture + VideoCapture kullanım alanlarını eşzamanlı olarak bağlayabilirsiniz. Ayrıca, kompozisyon modunda (CompositionSettings ile aynı kullanım alanları) artık nihai kompozisyon sonucuna uygulanan CameraEffect değerini ayarlayabilirsiniz.
  • Dinamik Sessize Alma: Artık PendingRecording.withAudioEnabled(boolean initialMuted) simgesini kullanarak kaydı sessiz başlatabilir ve kullanıcının daha sonra Recording.mute(boolean muted) simgesini kullanarak sesi açmasına izin verebilirsiniz.
  • Yetersiz depolama alanı işleme iyileştirildi: CameraX artık VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE hatasını güvenilir bir şekilde gönderiyor. Böylece uygulamanız, depolama alanının az olduğu durumlarda sorunsuz bir şekilde çalışabiliyor ve kullanıcıyı bilgilendirebiliyor.
  • Zayıf ışıkta geliştirme: Desteklenen cihazlarda (ör. Pixel 10 serisi) CameraControl.enableLowLightBoostAsync'i etkinleştirerek karanlık ortamlarda önizleme ve video akışlarının otomatik olarak parlaklaştırılmasını sağlayabilirsiniz.

Profesyonel Kalitede Resim Yakalama

CameraX 1.5, maksimum kalite ve esneklik isteyen geliştiriciler için ImageCapture'da önemli yükseltmeler sunuyor.

DNG (RAW) ile fotoğraf çekme özelliğiyle yaratıcı kontrolü ortaya çıkarın

CameraX artık DNG (RAW) çekimini destekliyor. Böylece, sonradan işleme üzerinde tam kontrol sahibi olabilirsiniz. Bu sayede, doğrudan kamera sensöründen işlenmemiş ve sıkıştırılmamış görüntü verilerine erişebilir, profesyonel düzeyde düzenleme ve renk derecelendirme yapabilirsiniz. API, yalnızca DNG dosyasının yakalanmasını veya eşzamanlı JPEG ve DNG çıkışlarının yakalanmasını destekler. JPEG ve DNG dosyalarını aynı anda nasıl yakalayacağınızla ilgili aşağıdaki örnek koda bakın.

  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) {}
    }
)

Kamera Uzantıları için Ultra HDR

Hem Kamera Uzantıları'nın (ör. Gece Modu) çarpıcı dijital fotoğrafçılığını hem de Ultra HDR'nin mükemmel renk ve dinamik aralığını bir arada kullanın. Bu özellik artık Pixel 9/10 serisi ve Samsung S24/S25 serisi gibi birçok yeni premium Android telefonda desteklenmektedir.

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

Temel API ve Kullanılabilirlik Geliştirmeleri

Yeni bir yapılandırma yöntemi: SessionConfig

Yukarıdaki örneklerde görüldüğü gibi SessionConfig, CameraX 1.5'teki yeni bir kavramdır. Yapılandırmayı merkezileştirir ve API'yi iki temel şekilde basitleştirir:

  1. Artık Manuel unbind()Çağrı Yok: CameraX API'leri yaşam döngüsüne duyarlıdır. Etkinlik veya diğer LifecycleOwner yok edildiğinde kullanım alanlarınızın bağlantısı dolaylı olarak "kaldırılır". Ancak kullanım alanlarını güncellemek veya kameraları değiştirmek için yeniden bağlamadan önce unbind() veya unbindAll()'u aramanız gerekir. CameraX 1.5 ile yeni bir SessionConfig bağladığınızda CameraX, oturumu sizin için sorunsuz bir şekilde günceller ve bağlamayı kaldırma çağrılarına gerek kalmaz.
  2. Belirleyici kare hızı kontrolü: Yeni SessionConfig API, kare hızını yönetmek için belirleyici bir yöntem sunar. Yalnızca bir ipucu olan önceki setTargetFrameRate yönteminin aksine, bu yeni yöntem, belirtilen kare hızı aralığının başarılı yapılandırma sonrasında uygulanacağını garanti eder. Doğruluğu sağlamak için CameraInfo.getSupportedFrameRateRanges(SessionConfig) kullanarak desteklenen kare hızlarını sorgulamanız gerekir. CameraX, tam SessionConfig değerini ileterek desteklenen aralıkları akış yapılandırmalarına göre doğru bir şekilde belirleyebilir.

Kamera ile Beste özelliği artık kararlı

Jetpack Compose'u ne kadar çok sevdiğinizi biliyoruz. Bu nedenle, camera-compose kitaplığının artık 1.5.1 sürümünde kararlı olduğunu duyurmaktan heyecan duyuyoruz. Bu sürümde, moveableContentOf ve Pager gibi Compose özellikleriyle CameraXViewfinder kullanımıyla ilgili kritik hata düzeltmelerinin yanı sıra önizleme uzatma sorunu da giderildi. Gelecekteki sürümlerde camera-compose'ya daha fazla özellik eklemeye devam edeceğiz.

ImageAnalysis ve CameraControl'da yapılan iyileştirmeler

  • El Feneri Gücü Ayarı: Yeni API'lerle cihazın el feneri üzerinde ayrıntılı kontrol elde edin. CameraInfo.getMaxTorchStrengthLevel() kullanarak desteklenen maksimum gücü sorgulayabilir, ardından CameraControl.setTorchStrengthLevel() ile istediğiniz seviyeyi ayarlayabilirsiniz.
  • NV21 desteği ImageAnalysis: Artık NV21 görüntü biçimini doğrudan ImageAnalysis'den isteyebilirsiniz. Bu sayede diğer kitaplıklar ve API'lerle entegrasyon kolaylaşır. Bu özellik, ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21) çağrılarak etkinleştirilir.

Başlangıç Adımları

Bağımlılıklarınızı bugün CameraX 1.5'e güncelleyin ve heyecan verici yeni özellikleri keşfedin. Neler oluşturacağınızı görmek için sabırsızlanıyoruz.

CameraX 1.5'i kullanmak için lütfen libs.versions.toml dosyanıza aşağıdaki bağımlılıkları ekleyin. (Birçok kritik hata düzeltmesi ve eşzamanlı kamera iyileştirmesi içeren 1.5.1 sürümünü kullanmanızı öneririz.) 

  [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" }

Ardından bunları modülünüzün build.gradle.kts bağımlılıklarına ekleyin:

  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 

}

Sorularınız mı var veya CameraX ekibiyle mi iletişime geçmek istiyorsunuz? CameraX geliştiricileri tartışma grubuna katılın veya hata raporu gönderin:

Yazan:

Okumaya devam edin