HDR video yakalama

Not: Bu sayfa Kamera2 paketiyle ilgilidir. Uygulamanız için Kamera2'nin belirli, alt düzey özellikleri gerekmiyorsa, KameraX'i kullanmanızı öneririz. Hem CameraX hem de Camera2, Android 5.0 (API düzeyi 21) ve sonraki sürümleri destekler.

Kamera2 API'leri desteği Yüksek Dinamik Aralıklı (HDR) video yakalama özelliği sayesinde, önizleme yapabilir ve kameranızı kullanarak HDR video içeriği kaydedebilirsiniz. Standart Dinamik ile karşılaştırıldığında Aralık (SDR), HDR daha geniş bir renk aralığı sunar ve dinamik parlaklık bileşeni aralığı (mevcut 100 cd/m2 ila 1000 sn. cd/m2'den). Bu sayede video kalitesi, gerçek hayattakine daha benzerdir. daha zengin renkler, daha parlak vurgular ve daha koyu gölgeler.

HDR videonun gün batımını daha canlı ve ayrıntılı olarak nasıl yakaladığını görün.

Şekil 1. SDR (üst) ve HDR (alt) video kalitesi karşılaştırması.
ziyaret edin.
'nı inceleyin.

Cihaz ön koşulları

HDR video yakalamayı tüm Android cihazlar desteklemez. Uygulamanızda HDR video çekmeden önce cihazınızın, uygunluk koşullarını karşılayıp karşılamadığını belirleyin. şu ön koşulları sağlayabilir:

  • Android 13'ü (API düzeyi 33) hedefler.
  • 10 bit veya daha yüksek kapasiteli bir kamera sensörü olmalıdır. HDR hakkında daha fazla bilgi için Destek ile ilgili yardım için HDR desteğini kontrol etme bölümüne bakın.

Tüm cihazlar ön koşulları karşılamadığı için ayrı bir kod ekleyebilirsiniz istediğiniz yolu seçin. Bu sayede uygulamanız, uyumlu olmayan cihazlarda SDR'ye döner. SDR için bir kullanıcı arayüzü seçeneği de ekleyebilirsiniz. Kullanıcı daha sonra HDR ve SDR arasındaki farkları gidermeyi başardık.

HDR yakalama mimarisi

Aşağıdaki şemada, HDR yakalama mimarisinin ana bileşenleri gösterilmektedir.

HDR yakalama mimarisi şeması.
Şekil 2. HDR yakalama mimarisi şeması.

Bir kamera cihazı HDR olarak bir kare yakaladığında, Camera2 çerçevesi işlenmiş kamera sensörü çıkışını depolayan bir arabellek. Ayrıca, HDR profili için gerekiyorsa ilgili HDR meta verilerini de ekler. Daha sonra Camera2 çerçevesi, doldurulan arabelleği çıkış yüzeyi için sıraya alır. CaptureRequest içinde referans verilen, bir ekran veya video kodlayıcıyı şemada gösterildiği gibi kullanın.

HDR desteğini kontrol etme

Uygulamanızda HDR video çekmeden önce cihazın şunları destekleyip desteklemediğini belirleyin: istediğiniz HDR profilini seçin.

Aşağıdakileri edinmek için CameraManager getCameraCharacteristics() yöntemini kullanın: CameraCharacteristics Örneğin, cihazınızın HDR özelliklerini sorgulayabilirsiniz.

Aşağıdaki adımlarda cihazın HLG10'u destekleyip desteklemediği kontrol edilir. HLG10, cihaz üreticilerinin desteklemesi gereken temel HDR standardıdır 10 bit çıkışa sahip kameralarda geçerlidir.

  1. Öncelikle cihazın 10 bit profilleri (HLG10 için bit derinliği) destekleyip desteklemediğini kontrol edin:

    Kotlin

    private fun isTenBitProfileSupported(cameraId: String): Boolean {
      val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)
      val availableCapabilities = cameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
      for (capability in availableCapabilities!!) {
          if (capability == CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT) {
              return true
          }
      }
      return false
    }
    
  2. Ardından, cihazın HLG10'u (veya desteklenen başka bir profili) destekleyip desteklemediğini kontrol edin:

    Kotlin

    @RequiresApi(api = 33)
    private fun isHLGSupported(cameraId: String): Boolean {
    if (isTenBitProfileSupported(cameraId)) {
      Val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)
      val availableProfiles = cameraCharacteristics
      .get(CameraCharacteristics.REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES)!!
      .getSupportedProfiles()
    
      // Checks for the desired profile, in this case HLG10
      return availableProfiles.contains(DynamicRangeProfiles.HLG10)
    }
    return false;
    }
    

Cihaz HDR'yi destekliyorsa isHLGSupported(), her zaman true değerini döndürür. Daha fazla bilgi için CameraCharacteristics referans belgeler.

HDR yakalamayı ayarlayın

Cihazınızın HDR'yi desteklediğinden emin olduktan sonra uygulamanızı, fotoğraf çekecek şekilde ayarlayın kameradan alınan ham HDR video akışıdır. Akışın OutputConfiguration özelliğini sağlamak için setDynamicRangeProfile() simgesini kullanın Bu profil, cihaz tarafından desteklenen bir HDR profiliyle CameraCaptureSession üzerine konuşacağız. Desteklenen HDR profillerinin listesine bakın.

Aşağıdaki kod örneğinde, setupSessionDynamicRangeProfile() ilk olarak Android 13 yüklü olduğundan emin olun. Ardından, CameraCaptureSession cihazını desteklenen cihazla kurar. OutputConfiguration olarak HDR profili:

Kotlin

  /**
  * Creates a [CameraCaptureSession] with a dynamic range profile.
  */
  private fun setupSessionWithDynamicRangeProfile(
          dynamicRange: Long,
          device: CameraDevice,
          targets: List,
          handler: Handler? = null,
          stateCallback: CameraCaptureSession.StateCallback
  ): Boolean {
      if (android.os.Build.VERSION.SDK_INT >=
              android.os.Build.VERSION_CODES.TIRAMISU) {
          val outputConfigs = mutableListOf()
              for (target in targets) {
                  val outputConfig = OutputConfiguration(target)
                  //sets the dynamic range profile, for example DynamicRangeProfiles.HLG10
                  outputConfig.setDynamicRangeProfile(dynamicRange)
                  outputConfigs.add(outputConfig)
              }

          device.createCaptureSessionByOutputConfigurations(
                  outputConfigs, stateCallback, handler)
          return true
      } else {
          device.createCaptureSession(targets, stateCallback, handler)
          return false
      }
  }

}

Kamera uygulamanız kamerayı başlattığında tekrarlanıyor CaptureRequest kaydı önizlemek için:

Kotlin

session.setRepeatingRequest(previewRequest, null, cameraHandler)

Ayrıca video kaydını başlatmak için:

Kotlin

// Start recording repeating requests, which stops the ongoing preview
//  repeating requests without having to explicitly call
//  `session.stopRepeating`
session.setRepeatingRequest(recordRequest,
        object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(session: CameraCaptureSession,
            request: CaptureRequest, result: TotalCaptureResult) {
        if (currentlyRecording) {
            encoder.frameAvailable()
        }
    }
}, cameraHandler)

HDR kamera akışını kodlama

HDR kamera akışını kodlamak ve dosyayı diske yazmak için MediaCodec kullanın.

İlk olarak OutputSurface'nı alın, Bu depolama alanı, ham video verilerini depolayan bir arabelleğe eşlenir. MediaCodec için, createInputSurface() kullanın.

MediaCodec uygulamasını ilk kullanıma hazırlamak için uygulamanın bir MediaFormat (belirtilen) codec profili, renk alanı, renk aralığı ve aktarım işlevi:

Kotlin

val mimeType = when {
    dynamicRange == DynamicRangeProfiles.STANDARD -> MediaFormat.MIMETYPE_VIDEO_AVC
    dynamicRange < DynamicRangeProfiles.PUBLIC_MAX ->
            MediaFormat.MIMETYPE_VIDEO_HEVC
    else -> throw IllegalArgumentException("Unknown dynamic range format")
}

val codecProfile = when {
    dynamicRange == DynamicRangeProfiles.HLG10 ->
            MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10
    dynamicRange == DynamicRangeProfiles.HDR10 ->
            MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10
    dynamicRange == DynamicRangeProfiles.HDR10_PLUS ->
            MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus
    else -> -1
}
// Failing to correctly set color transfer causes quality issues
// for example, washout and color clipping
val transferFunction = when (codecProfile) {
    MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10 ->
            MediaFormat.COLOR_TRANSFER_HLG
    MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10 ->
            MediaFormat.COLOR_TRANSFER_ST2084
    MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus ->
            MediaFormat.COLOR_TRANSFER_ST2084
    else -> MediaFormat.COLOR_TRANSFER_SDR_VIDEO
}

val format = MediaFormat.createVideoFormat(mimeType, width, height)

// Set some properties.  Failing to specify some of these can cause the MediaCodec
// configure() call to throw an exception.
format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
        MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface)
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate)
format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate)
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL)

if (codecProfile != -1) {
    format.setInteger(MediaFormat.KEY_PROFILE, codecProfile)
    format.setInteger(MediaFormat.KEY_COLOR_STANDARD,
            MediaFormat.COLOR_STANDARD_BT2020)
    format.setInteger(MediaFormat.KEY_COLOR_RANGE, MediaFormat.COLOR_RANGE_LIMITED)
    format.setInteger(MediaFormat.KEY_COLOR_TRANSFER, transferFunction)
    format.setFeatureEnabled(MediaCodecInfo.CodecCapabilities.FEATURE_HdrEditing,
            true)
}

mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)

Uygulama hakkında daha fazla bilgi için Camera2Video örnek uygulamasının EncoderWrapper.kt.

HDR biçimleri

Android 13'ten itibaren 10 bit çıkış özelliklerine sahip kamera cihazları HDR yakalama için HLG10'u desteklemelidir ve oynatma. Ayrıca, cihaz üreticileri istedikleri HDR biçimini etkinleştirebilir HDR yakalama mimarisi kullanın.

Aşağıdaki tabloda, kullanılabilir HDR biçimleri ve özellikleri özetlenmiştir. (ör. HDR video çekimi için)

Biçim Aktarım İşlevi (TF) Meta veri Codec Bit Derinliği
HLG10 HLG Hayır HEVC 10 Bit
HDR10 PQ Statik HEVC 10 Bit
HDR10+ PQ Dinamik HEVC 10 Bit
Dolby Vision 8.4 HLG Dinamik HEVC 10 Bit

Kaynaklar

HDR video yakalama işlevine sahip çalışan bir uygulama için Kamera2Video örneği bulabilirsiniz.