La tecnologia HDR, o High Dynamic Range, offre una gamma più ampia di colori e una il contrasto tra i bianchi più chiari e le ombre più scure, ottenendo così una qualità più simile a quella percepita a occhio nudo.
Puoi configurare la riproduzione dei video HDR nella tua app per visualizzare l'anteprima e riprodurre i video HDR contenuti.
Questo articolo presuppone che tu abbia già aggiunto il supporto di base della riproduzione di video a la tua app. Consulta la documentazione di ExoPlayer per maggiori dettagli sulla riproduzione.
Prerequisiti del dispositivo
Non tutti i dispositivi Android supportano la riproduzione HDR. Prima della riproduzione HDR contenuti video nella tua app, determina se il dispositivo soddisfa i requisiti seguenti prerequisiti:
- Ha come target Android 7.0 o versioni successive (livello API 24).
- Dispone di un decodificatore compatibile con HDR e dell'accesso a un display compatibile con HDR.
Verificare il supporto della riproduzione HDR
Utilizza Display.getHdrCapabilities()
per eseguire query sulle funzionalità HDR di un display. Il metodo restituisce informazioni sui profili HDR supportati e sull'intervallo di luminanza del display.
Il seguente codice verifica se il dispositivo supporta la riproduzione HLG10. A partire da Android 13, HLG10 è lo standard minimo che i produttori di dispositivi devono supportare se il dispositivo supporta la riproduzione HDR:
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"); }
Configurare la riproduzione HDR nell'app
Se la tua app utilizza ExoPlayer, supporta la riproduzione HDR per impostazione predefinita. Per i passaggi successivi, vedi Verificare il supporto della riproduzione HDR.
Se l'app non utilizza ExoPlayer, configura la riproduzione HDR utilizzando MediaCodec
tramite SurfaceView
.
Configurare MediaCodec utilizzando SurfaceView
Configura un flusso di riproduzione standard di MediaCodec
utilizzando SurfaceView
. Ciò consente di visualizzare i contenuti video HDR senza alcuna gestione speciale per la riproduzione HDR:
MediaCodec
: decodifica i contenuti video HDR.SurfaceView
: vengono visualizzati contenuti video HDR.
Il seguente codice verifica se il codec supporta il profilo HDR, quindi configura MediaCodec
utilizzando SurfaceView
:
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();
Per altre implementazioni di MediaCodec
utilizzando SurfaceView
, guarda gli esempi di fotocamere Android.
Risorse
Per ulteriori informazioni relative alla riproduzione HDR, consulta le seguenti risorse:
HDR
- Acquisizione video HDR: scopri come configurare l'acquisizione di video HDR utilizzando le API Camera2.
- Esempio di Camera2Video su GitHub: guarda un'app funzionante con la funzionalità di acquisizione e riproduzione HDR.
Contenuti multimediali
- Riferimento dell'API Media: scopri di più sulle API Media.
- ExoPlayer: scopri come configurare la tua app con la libreria ExoPlayer.