Ürün Haberleri

CameraX 1.5 ile Tanışın: Güçlü Video Kaydı ve Profesyonel Düzeyde Resim Yakalama

Okuma süresi: 7 dk.
Scott Nien'in profilini görüntüle
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üzeyde özellikleri parmaklarınızın ucuna getirirken kamera oturumunu yapılandırmayı her zamankinden daha kolay hale getirmeye odaklanıyor.

Video kaydı için 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.

Resim Yakalama konusunda, işlenmemiş ve sıkıştırılmamış DNG (RAW) dosyalarını yakalama desteğiyle 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 göz atalım.

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 sunar.

Ağır Çekim ve Yüksek Kare Hızlı Video

En çok beklenen özelliklerimizden biri olan ağır çekim video hemen oynayabilirsiniz. Artık yüksek hızlı video (ör. 120 veya 240 fps) çekebilir ve doğrudan etkileyici bir ağır çekim videoya dönüştürebilirsiniz. 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 bunu uygulamak kolaydır.

1. Yüksek hız desteğini kontrol etme: 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ırma ve bağlama: HighSpeedVideoSessionConfig oluşturmak için döndürülen videoCapabilities değerini (desteklenen video kalitesi bilgilerini içerir) kullanın. 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) yöntemini ç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() 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 özel CameraConstrainedHighSpeedCaptureSession ve CamcorderProfile desteği gerekir. Kötü 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 ve diğer üreticilerin belirli modellerinin arka kameralarında desteklenmektedir.

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

Özellikleri Güvenle Birleştirme: 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'si sayesinde 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 stabilizasyonunu aynı anda etkinleştirebilirsiniz. Gelecekteki geliştirmeler arasında 4K kayıt ve ultra geniş yakınlaştırma yer alıyor. 

Özellik grubu API'si iki temel kullanım alanı sağlar:

1. Kullanım Alanı: En Yüksek Kaliteye Öncelik Verme

Özelliklerin mümkün olan en iyi kombinasyonunu kullanarak yakalamak 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. Önizleme Sabitleme
  8. Yok

2. Kullanım Alanı: Kullanıcılara 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 bir şekilde yansıtabilir ve aşağıdaki resimde olduğu gibi desteklenmeyen seçeneklerin 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 aşağıdaki kodları kullanarak özellik kombinasyonu desteğini kontrol edin. 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 devre dışı bırakılması gerekip gerekmediğini görmek için kalan özellikleri etkinleştirilen özelliklerle 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 Özellik Grubu blog yayınını inceleyin. 

Daha Fazla Video İyileştirmesi

  • Eşzamanlı Kamera İyileştirmeleri: CameraX 1.5.1 ile artık kompozisyon dışı modda her SingleCameraConfig için Preview + ImageCapture + VideoCapture kullanım alanlarını eşzamanlı olarak bağlayabilirsiniz. Ayrıca, oluşturma modunda (CompositionSettings ile aynı kullanım alanları) artık nihai oluşturma sonucuna uygulanan CameraEffect değerini ayarlayabilirsiniz.
  • Dinamik ses kapatma: Artık PendingRecording.withAudioEnabled(boolean initialMuted) kullanarak kaydı sessiz durumda başlatabilir ve kullanıcının daha sonra Recording.mute(boolean muted) 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öndererek uygulamanızın düşük depolama alanı durumlarını sorunsuz bir şekilde işlemesine ve kullanıcıyı bilgilendirmesine olanak tanır.
  • Düşük Işık 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'yi etkinleştirebilirsiniz.

Profesyonel düzeyde Resim Yakalama

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

DNG (RAW) Çekim ile Reklam Öğesi Kontrolünü Ortaya Çıkarma

CameraX, işlem sonrası üzerinde tam kontrol sağlamak için artık DNG (RAW) çekimini destekliyor. Bu sayede, doğrudan kamera sensöründen gelen işlenmemiş, sıkıştırılmamış görüntü verilerine erişerek profesyonel düzeyde düzenleme ve renk derecelendirme yapabilirsiniz. API, yalnızca DNG dosyasını yakalamayı veya eşzamanlı JPEG ve DNG çıkışlarını yakalamayı destekler. JPEG ve DNG dosyalarını aynı anda nasıl yakalayacağınızı öğrenmek 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

Her iki dünyanın da en iyi özelliklerinden yararlanın: Kamera Uzantıları'nın (Gece Modu gibi) çarpıcı dijital fotoğrafçılığı ile Ultra HDR'nin muhteşem renk ve dinamik aralığı bir arada. 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'te yeni bir kavramdır. Yapılandırmayı merkezileştirir ve API'yi iki temel şekilde basitleştirir:

  1. Manuel unbind() çağrılara son: 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ını" dolaylı olarak kaldırır. Ancak kullanım alanlarını güncellemek veya kameralar arasında geçiş yapmak için yeniden bağlamadan önce unbind() veya unbindAll() yöntemini çağırmanı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ğlama kaldırma çağrılarına gerek kalmaz.
  2. Deterministik kare hızı kontrolü: Yeni SessionConfig API, kare hızını yönetmek için deterministik bir yöntem sunar. Yalnızca bir ipucu olan önceki setTargetFrameRate yönteminin aksine, bu yeni yöntem, başarılı bir yapılandırmanın ardından belirtilen kare hızı aralığının uygulanacağını garanti eder. Doğru sonuçlar için CameraInfo.getSupportedFrameRateRanges(SessionConfig) kullanarak desteklenen kare hızlarını sorgulamanız gerekir. SessionConfig değerinin tamamını ilettiğinizde CameraX, akış yapılandırmalarına göre desteklenen aralıkları doğru şekilde belirleyebilir.

Camera-Compose Artık Kararlı Sürümde

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

ImageAnalysis ve CameraControl İyileştirmeleri

  • El feneri gücü ayarı: Yeni API'lerle cihazın el feneri üzerinde ayrıntılı kontrol sahibi olun. CameraInfo.getMaxTorchStrengthLevel() kullanarak desteklenen maksimum gücü sorgulayabilir ve ardından CameraControl.setTorchStrengthLevel() ile istediğiniz seviyeyi ayarlayabilirsiniz.
  • ImageAnalysis'da NV21 desteği: Artık NV21 resim biçimini doğrudan ImageAnalysis'dan isteyebilirsiniz. Böylece diğer kitaplıklar ve API'lerle entegrasyonu basitleştirebilirsiniz. Bu, ImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21) çağrılarak etkinleştirilir.

Hemen başlayın

Bağımlılıklarınızı CameraX 1.5'e hemen güncelleyin ve heyecan verici yeni özellikleri keşfedin. Neler geliştireceğinizi 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 iletişime geçmek mi istiyorsunuz? CameraX geliştirici tartışma grubuna katılın veya hata raporu gönderin:

Yazan:
Okumaya devam et