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.
'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.
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.
Ö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 }
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.