Ürün Haberleri

CameraX 1.5 ile tanışın: Güçlü video kaydı ve profesyonel düzeyde görüntü 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 odaklanıyor.

Video kaydı özelliği sayesinde kullanıcılar artık kolayca etkileyici ağır çekim veya yüksek kare hızlı videolar çekebilir. Daha da önemlisi, yeni Feature Group API (Özellik Grubu API'si) sayesinde 10 bit HDR ve 60 FPS gibi karmaşık kombinasyonları güvenle etkinleştirebilir, böylece desteklenen cihazlarda tutarlı sonuçlar elde edebilirsiniz.

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ıyor. Şimdi bu heyecan verici yeni özelliklerin ayrıntılarına geçelim.

Güçlü Video Kaydı: Yüksek Hız 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() simgesini 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 sunar. 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 sabitleme özelliklerini aynı anda etkinleştirebilirsiniz. Gelecekteki geliştirmelerde 4K kayıt ve ultra geniş yakınlaştırma özelliklerinin yer alması planlanmaktadır. 

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

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

Özelliklerin mümkün olan en iyi kombinasyonunu kullanarak çekim yapmak istiyorsanız öncelikli bir liste sağlayabilirsiniz. CameraX, bu özellikleri sırayla etkinleştirmeye çalışır ve cihazın tam olarak desteklediği ilk kombinasyonu seçer.

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 grileştirilip grileştirilmeyeceğini 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, uyumluluk kısıtlamaları nedeniyle açma/kapatma düğmelerinin grileştirilmesi gerekip gerekmediğini görmek için kalan özellikleri etkinleştirilen özelliklerle birlikte yeniden sorgulayın.

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 öğesini ayarlayabilirsiniz.
  • Dinamik Sessize Alma: Artık PendingRecording.withAudioEnabled(boolean initialMuted) tuşunu kullanarak kaydı sessiz başlatabilir ve kullanıcının daha sonra Recording.mute(boolean muted) tuşunu kullanarak sesi açmasına izin verebilirsiniz.
  • Yetersiz depolama alanı işleme özelliği 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 Işıkta Geliştirme: Desteklenen cihazlarda (ör. Pixel 10 serisi) karanlık ortamlarda önizleme ve video akışlarını otomatik olarak aydınlatmak için CameraControl.enableLowLightBoostAsync'i etkinleştirebilirsiniz.

Profesyonel Kalitede Resim Yakalama

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

DNG (RAW) yakalama ile yaratıcı kontrolü serbest bırakın

CameraX, artık DNG (RAW) yakalamayı destekleyerek sonradan işleme üzerinde tam kontrol sağlar. 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, DNG dosyasının tek başına yakalanmasını veya eşzamanlı JPEG ve DNG çıkışlarının yakalanmasını destekler. JPEG ve DNG dosyalarını aynı anda yakalama hakkında bilgi edinmek için 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ı hesaplamalı 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 destekleniyor.

// 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'te 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ünün farkındadır. Etkinlik veya diğer LifecycleOwner yok edildiğinde kullanım alanlarınızın bağlantısını örtülü olarak "kaldırır". Ancak kullanım alanlarını güncellemek veya kameralar arasında geçiş yapmak için yeniden bağlamadan önce hâlâ unbind() veya unbindAll()'ı çağırmanız gerekir. Artık CameraX 1.5 ile yeni bir SessionConfig bağladığınızda CameraX, oturumu sizin için sorunsuz bir şekilde güncelleyerek bağlantıyı 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ı bir yapılandırmanın ardından 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 akış yapılandırmalarına göre desteklenen aralıkları 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 İyileştirmeler

  • Fener Gücü Ayarı: Yeni API'ler sayesinde cihazın 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