HDR (High Dynamic Range) bietet eine größere Farbpalette und mehr Kontrast zwischen dem hellsten Weiß und den dunkelsten Schatten. eine Qualität, die dem entspricht, was das bloße Auge wahrnimmt.
Du kannst die HDR-Videowiedergabe in deiner App einrichten, um dir eine Vorschau und Wiedergabe von HDR-Videos anzusehen Inhalte.
In diesem Artikel wird davon ausgegangen, dass Sie bereits grundlegende Funktionen für die Videowiedergabe hinzugefügt haben. für Ihre App. In der ExoPlayer-Dokumentation erfahren Sie, zur Wiedergabe.
Erforderliche Geräte
Nicht alle Android-Geräte unterstützen die HDR-Wiedergabe. Vor der HDR-Wiedergabe Videoinhalte in Ihrer App verfügbar sind, prüfen Sie, ob Ihr Gerät die folgenden Anforderungen erfüllt: Voraussetzungen:
- Ausrichtung auf Android 7.0 oder höher (API-Ebene 24).
- Es verfügt über einen HDR-fähigen Decoder und einen HDR-fähigen Bildschirm.
Unterstützung bei der HDR-Wiedergabe prüfen
Mit Display.getHdrCapabilities()
kannst du die HDR-Funktionen eines Bildschirms abfragen. Die Methode gibt Informationen über die unterstützten HDR-Profile und den Leuchtdichtebereich für den Bildschirm zurück.
Mit dem folgenden Code wird geprüft, ob das Gerät die HLG10-Wiedergabe unterstützt. Ab Android 13 ist HLG10 der Mindeststandard, den Gerätehersteller unterstützen müssen, wenn das Gerät HDR-Wiedergabe unterstützt:
Kotlin
// Check if display supports the HDR type val capabilities = display?.hdrCapabilities?.supportedHdrTypes ?: intArrayOf() if (!capabilities.contains(HDR_TYPE_HLG)) { throw RuntimeException("Display does not support desired HDR type"); }
Java
// Check if display supports the HDR type int[] list = getDisplay().getHdrCapabilities().getSupportedHdrTypes(); Listcapabilities = Arrays.stream(list).boxed().collect(Collectors.toList()); if (!capabilities.contains(HDR_TYPE_HLG)) { throw new RuntimeException("Display does not support desired HDR type"); }
HDR-Wiedergabe in der App einrichten
Wenn Ihre App den ExoPlayer verwendet, wird die HDR-Wiedergabe standardmäßig unterstützt. Weitere Informationen finden Sie unter HDR-Wiedergabe unterstützen.
Wenn deine App ExoPlayer nicht verwendet, richte die HDR-Wiedergabe mit MediaCodec
über SurfaceView
ein.
MediaCodec mit SurfaceView einrichten
Richte mit SurfaceView
einen standardmäßigen MediaCodec
-Wiedergabeablauf ein. So kannst du HDR-Videoinhalte ohne besondere Behandlung bei der HDR-Wiedergabe wiedergeben:
MediaCodec
: Decodiert HDR-Videoinhalte.SurfaceView
: Zeigt HDR-Videoinhalte an.
Der folgende Code prüft, ob der Codec das HDR-Profil unterstützt, und richtet dann MediaCodec
mit SurfaceView
ein:
Kotlin
// Check if there's a codec that supports the specific HDR profile val list = MediaCodecList(MediaCodecList.REGULAR_CODECS) var format = MediaFormat() /* media format from the container */; format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AV1ProfileMain10) val codecName = list.findDecoderForFormat (format) ?: throw RuntimeException ("No codec supports the format") // Here is a standard MediaCodec playback flow val codec: MediaCodec = MediaCodec.createByCodecName(codecName); val surface: Surface = surfaceView.holder.surface val callback: MediaCodec.Callback = (object : MediaCodec.Callback() { override fun onInputBufferAvailable(codec: MediaCodec, index: Int) { queue.offer(index) } override fun onOutputBufferAvailable( codec: MediaCodec, index: Int, info: MediaCodec.BufferInfo ) { codec.releaseOutputBuffer(index, timestamp) } override fun onError(codec: MediaCodec, e: MediaCodec.CodecException) { // handle error } override fun onOutputFormatChanged( codec: MediaCodec, format: MediaFormat ) { // handle format change } }) codec.setCallback(callback) codec.configure(format, surface, crypto, 0 /* flags */) codec.start() while (/* until EOS */) { val index = queue.poll() val buffer = codec.getInputBuffer(index) buffer?.put(/* write bitstream */) codec.queueInputBuffer(index, offset, size, timestamp, flags) } codec.stop() codec.release()
Java
// Check if there's a codec that supports the specific HDR profile MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS); MediaFormat format = /* media format from the container */; format.setInteger( MediaFormat.KEY_PROFILE, CodecProfileLevel.AV1ProfileMain10); String codecName = list.findDecoderForFormat(format); if (codecName == null) { throw new RuntimeException("No codec supports the format"); } // Below is a standard MediaCodec playback flow MediaCodec codec = MediaCodec.getCodecByName(codecName); Surface surface = surfaceView.getHolder().getSurface(); MediaCodec.Callback callback = new MediaCodec.Callback() { @Override void onInputBufferAvailable(MediaCodec codec, int index) { queue.offer(index); } @Override void onOutputBufferAvailable(MediaCodec codec, int index) { // release the buffer for render codec.releaseOutputBuffer(index, timestamp); } @Override void onOutputFormatChanged(MediaCodec codec, MediaFormat format) { // handle format change } @Override void onError(MediaCodec codec, MediaCodec.CodecException ex) { // handle error } }; codec.setCallback(callback); codec.configure(format, surface, crypto, 0 /* flags */); codec.start(); while (/* until EOS */) { int index = queue.poll(); ByteBuffer buffer = codec.getInputBuffer(index); buffer.put(/* write bitstream */); codec.queueInputBuffer(index, offset, size, timestamp, flags); } codec.stop(); codec.release();
Weitere MediaCodec
-Implementierungen mit SurfaceView
finden Sie in den Android-Kamera-Beispielen.
Ressourcen
Weitere Informationen zur HDR-Wiedergabe finden Sie in den folgenden Ressourcen:
HDR
- HDR-Videoaufzeichnung: Hier erfahren Sie, wie Sie die HDR-Videoaufnahme mit den Camera2 APIs einrichten.
- Camera2Video-Beispiel bei GitHub: Sehen Sie sich eine funktionierende App mit HDR-Aufnahme- und -Wiedergabefunktion an.
Medien
- Media API-Referenz: Weitere Informationen zu Media APIs
- ExoPlayer: Informationen zum Einrichten Ihrer App mit der ExoPlayer-Bibliothek