Hinweis:Diese Seite bezieht sich auf das Camera2-Paket. Sofern für Ihre App keine spezifischen Low-Level-Funktionen von Camera2 erforderlich sind, empfehlen wir die Verwendung von CameraX. Sowohl CameraX als auch Camera2 unterstützen Android 5.0 (API-Level 21) und höher.
Unterstützung für Camera2 APIs HDR-Videoaufzeichnung (High Dynamic Range), mit der Sie eine Vorschau HDR-Videos mit der Kamera aufnehmen. Im Vergleich zu standardmäßigen dynamischen Creatives Range (SDR), HDR bietet einen größeren Farbraum und erhöht die Dynamik Bereich der Leuchtdichtekomponente (von den aktuellen 100 cd/m2 bis zu 1.000 cd/m2) Die Videoqualität entspricht eher dem realen Leben, kräftigere Farben, hellere Spitzlichter und dunklere Schatten.
Sieh dir an, wie HDR-Videos einen Sonnenuntergang mit leuchtenden Details aufnehmen.
<ph type="x-smartling-placeholder">

Erforderliche Geräte
HDR-Videoaufnahmen werden nicht von allen Android-Geräten unterstützt. Prüfen Sie vor dem Aufnehmen von HDR-Videos in Ihrer App, ob Ihr Gerät die die folgenden Voraussetzungen erfüllen:
- Ausrichtung auf Android 13 (API-Level 33).
- Der Kamerasensor muss mindestens 10 Bit lang sein. Weitere Informationen zu HDR Informationen zur Unterstützung finden Sie unter HDR-Unterstützung prüfen.
Da nicht alle Geräte die Voraussetzungen erfüllen, können Sie einen separaten Code hinzufügen wenn du die HDR-Videoaufnahme in deiner App einrichtest. Dadurch kann deine App auf inkompatiblen Geräten auf SDR zurückgreifen. Du kannst auch eine UI-Option für SDR hinzufügen. Der Nutzer kann dann zwischen SDR und HDR wählen.
Architektur bei HDR-Aufnahmen
Das folgende Diagramm zeigt die Hauptkomponenten der Architektur für HDR-Aufnahmen.
<ph type="x-smartling-placeholder">
Wenn ein Kameragerät einen Frame in HDR aufnimmt, weist das Camera2-Framework
einen Zwischenspeicher, in dem die verarbeitete Kamerasensorausgabe gespeichert wird.
Außerdem werden die entsprechenden HDR-Metadaten angehängt, wenn dies für das HDR-Profil erforderlich ist.
Das Camera2-Framework stellt dann den gefüllten Zwischenspeicher für die Ausgabeoberfläche in die Warteschlange
auf die im CaptureRequest
verwiesen wird, etwa ein Display- oder
wie in der Abbildung dargestellt.
HDR-Unterstützung prüfen
Bevor Sie HDR-Videos in Ihrer App aufnehmen, prüfen Sie, ob das Gerät dies unterstützt das gewünschte HDR-Profil.
Verwenden Sie die Methode CameraManager
getCameraCharacteristics()
, um ein
CameraCharacteristics
die Sie nach den HDR-Funktionen Ihres Geräts abfragen können.
Mit den folgenden Schritten kannst du prüfen, ob ein Gerät HLG10 unterstützt. HLG10 ist der grundlegende HDR-Standard, den Gerätehersteller unterstützen müssen bei Kameras mit 10-Bit-Ausgang.
Prüfen Sie zuerst, ob das Gerät 10-Bit-Profile unterstützt (die Bittiefe für HLG10):
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
}Prüfe als Nächstes, ob das Gerät HLG10 (oder ein anderes unterstütztes Profil) unterstützt:
@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;
}
Wenn das Gerät HDR unterstützt, gibt isHLGSupported()
immer true
zurück.
Weitere Informationen finden Sie in der
CameraCharacteristics
in der Referenzdokumentation.
HDR-Aufnahme einrichten
Stelle sicher, dass dein Gerät HDR unterstützt, und richte deine App für Aufnahmen ein
einen unbearbeiteten HDR-Videostream von der Kamera.
Verwende setDynamicRangeProfile()
, um die OutputConfiguration
des Streams anzugeben.
mit einem geräteunterstützten HDR-Profil, das dann
an CameraCaptureSession
bei der Erstellung.
Hier findest du eine Liste der unterstützten HDR-Profile.
Im folgenden Codebeispiel prüft setupSessionDynamicRangeProfile()
zuerst
ob auf dem Gerät Android 13 installiert ist.
Dann wird das CameraCaptureSession
mit den geräteunterstützten
HDR-Profil als OutputConfiguration
:
/**
* Creates a [CameraCaptureSession] with a dynamic range profile.
*/
private fun setupSessionWithDynamicRangeProfile(
dynamicRange: Long,
device: CameraDevice,
targets: List
Wenn die Kamera-App die Kamera initialisiert,
wird wiederholt
CaptureRequest
um eine Vorschau der Aufzeichnung anzusehen:
session.setRepeatingRequest(previewRequest, null, cameraHandler)
Und um die Videoaufzeichnung zu starten:
// 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-Kamerastream codieren
So codieren Sie den HDR-Kamerastream und schreiben die Datei auf die Festplatte:
Verwenden Sie MediaCodec
.
Holen Sie sich zuerst das OutputSurface
,
die einem Zwischenspeicher zugeordnet ist,
in dem Videorohdaten gespeichert werden.
Für MediaCodec
,
Verwenden Sie createInputSurface()
.
Zum Initialisieren von MediaCodec
muss eine App Folgendes erstellen:
MediaFormat
mit einem angegebenen
Codec-Profil, Farbraum, Farbbereich und Übertragungsfunktion:
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)
Weitere Informationen zur Implementierung finden Sie in der
EncoderWrapper.kt
HDR-Formate
Ab Android 13 werden Kameras mit 10-Bit-Ausgabefunktionen muss HLG10 für HDR-Aufnahmen unterstützen und playback: Außerdem können Gerätehersteller jedes HDR-Format ihrer Wahl aktivieren. mit der HDR-Aufnahmearchitektur.
In der folgenden Tabelle sind die verfügbaren HDR-Formate und ihre Funktionen zusammengefasst für HDR-Videoaufnahmen.
Formatieren | Übertragungsfunktion (TF) | Metadaten | Codec | Bittiefe |
---|---|---|---|---|
HLG10 | HLG | Nein | HEVC | 10 Bit |
HDR10 | PQ | Statisch | HEVC | 10 Bit |
HDR10+ | PQ | Dynamisch | HEVC | 10 Bit |
Dolby Vision 8.4 | HLG | Dynamisch | HEVC | 10 Bit |
Ressourcen
Eine funktionierende App mit HDR-Videoaufnahmefunktion finden Sie in der Videobeispiel für Kamera2 auf GitHub.