O HDR, ou High Dynamic Range, oferece uma gama mais ampla de cores e mais contraste entre os brancos mais brilhantes e as sombras mais escuras, resultando em qualidade que se assemelha mais ao que o olho nu percebe.
É possível configurar a reprodução de vídeos em HDR no app para visualizar e reproduzir vídeos em HDR conteúdo.
Este artigo presume que você já adicionou suporte básico para reprodução de vídeo ao seu app. Consulte a documentação do ExoPlayer para mais detalhes sobre a reprodução.
Pré-requisitos do dispositivo
Nem todos os dispositivos Android são compatíveis com a reprodução em HDR. Antes de reproduzir HDR conteúdo de vídeo no seu app, determine se o dispositivo atende aos seguintes pré-requisitos:
- É destinado ao Android 7.0 ou versões mais recentes (camada 24 da API).
- Tem um decodificador compatível com HDR e acesso a uma tela compatível com HDR.
Conferir o suporte para reprodução em HDR
Use Display.getHdrCapabilities()
para consultar os recursos de HDR de uma tela. O método retorna informações sobre os perfis HDR e o intervalo de luminância compatíveis para a tela.
O código a seguir verifica se o dispositivo é compatível com a reprodução HLG10. No Android 13 e versões mais recentes, o HLG10 é o padrão mínimo com que os fabricantes de dispositivos precisam oferecer suporte se o dispositivo for compatível com a reprodução em 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"); }
Configurar a reprodução em HDR no app
Caso seu app use o ExoPlayer, ele será compatível com a reprodução HDR por padrão. Consulte Verificar a compatibilidade com a reprodução em HDR para saber as próximas etapas.
Se o app não usa o ExoPlayer, configure a reprodução em HDR usando MediaCodec
via SurfaceView
.
Configurar o MediaCodec usando SurfaceView
Configure um fluxo de reprodução padrão de MediaCodec
usando SurfaceView
. Isso permite a exibição de conteúdo de vídeo em HDR sem nenhum tratamento especial para a reprodução em HDR:
MediaCodec
: decodifica o conteúdo de vídeo HDR.SurfaceView
: mostra conteúdo de vídeo em HDR.
O código a seguir verifica se o codec é compatível com o perfil HDR e configura MediaCodec
usando 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();
Para conferir mais implementações de MediaCodec
usando SurfaceView
, consulte os exemplos da câmera Android.
Recursos
Para mais informações relacionadas à reprodução HDR, consulte os seguintes recursos:
HDR
- Captura de vídeo HDR: aprenda a configurar a captura de vídeo HDR usando as APIs Camera2.
- Exemplo de Camera2Video no GitHub (link em inglês): veja um app em funcionamento com funcionalidade de captura e reprodução em HDR.
Mídia
- Referência da API Media: saiba mais sobre as APIs Media.
- ExoPlayer: aprenda a configurar o app com a biblioteca do ExoPlayer.