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">
<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">
<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):
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 }
Prüfe als Nächstes, ob das Gerät HLG10 (oder ein anderes unterstütztes Profil) unterstützt:
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; }
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
für 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:
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 } }
}
Wenn die Kamera-App die Kamera initialisiert,
wird wiederholt
CaptureRequest
um eine Vorschau der Aufzeichnung anzusehen:
Kotlin
session.setRepeatingRequest(previewRequest, null, cameraHandler)
Und um die Videoaufzeichnung zu starten:
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-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:
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)
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.