Práticas recomendadas para compartilhamento de vídeos

Muitas pessoas compartilham vídeos usando o dispositivo Android. A qualidade do vídeo recebido geralmente é inferior à original por causa do processamento realizado pelo app de compartilhamento. Este documento descreve como otimizar a qualidade de vídeos compartilhados e algumas armadilhas comuns de processamento de vídeo a serem evitadas. Para otimizar o compartilhamento de conteúdo de vídeo HDR, consulte Usar o módulo Transformer para transcodificar HDR para SDR nesta página.

A principal coisa a fazer é manter uma resolução constante e a qualidade do vídeo o mais alta possível pelo maior tempo possível ao se preparar para compartilhar um vídeo.

O pipeline de compartilhamento

A Figura 1 ilustra um fluxo típico para compartilhamento de um vídeo:

Compartilhando pipeline de vídeo Figura 1. O pipeline de compartilhamento de vídeos.

O pipeline inclui estas etapas:

  1. Capture e codifique um vídeo, possivelmente adicionando efeitos durante a captura. Como alternativa, o usuário pode pular esta etapa e selecionar um vídeo do armazenamento que foi pré-gravado de outro app.
  2. Editar, filtrar, retocar ou processar o vídeo.
  3. Dimensione ou redimensione o vídeo em preparação para a transcodificação.
  4. Transcodificar o vídeo para compartilhamento. A filtragem na etapa 2 geralmente é aplicada como parte dessa etapa.

Há duas etapas no pipeline em que você tem a oportunidade de definir parâmetros que determinam a qualidade do vídeo: a codificação durante a gravação inicial e a transcodificação antes do compartilhamento. Além disso, talvez seja necessário redimensionar o vídeo antes da etapa final de transcodificação, o que também pode afetar a qualidade.

Recomendações

A Tabela 1 mostra os cinco parâmetros principais de qualidade de vídeo e indica quais etapas podem usá-los.

Parâmetro Gravar Compartilhar
Perfil S S
Resolução S S
Taxa de bits S S
Parâmetro de quantização (QP) (raramente) S
Frames B N S

Tabela 1. Principais parâmetros que determinam a qualidade do vídeo

Perfil

Para melhores resultados, use os perfis mais avançados fornecidos pelo codec específico. Para a codificação AVC, selecione High profile e nível 4.

Resolução, corte e dimensionamento

É possível alterar a resolução inicial do vídeo capturado na etapa de dimensionamento antes da transcodificação para compartilhamento, mas o dimensionamento pode prejudicar a qualidade do vídeo. Evite o escalonamento e selecione uma resolução para a codificação inicial que possa ser usada em todo o pipeline. Lembre-se também de que o corte extremo resulta em uma imagem de baixa qualidade, especialmente se você aumentar a imagem cortada. Siga as seguintes diretrizes:

  • Escolha uma resolução pelo menos tão grande quanto a resolução de compartilhamento final.
  • A resolução de captura não pode exceder muito a resolução de compartilhamento, a menos que todas as etapas intermediárias sejam projetadas para oferecer suporte a uma resolução maior (como a taxa de bits mais alta durante a captura inicial).

    • Se a codificação de compartilhamento produzir uma resolução de 720 x 1280, recomendamos uma resolução de captura de 720 x 1280.
    • Se as etapas intermediárias entre a captura e o compartilhamento incluírem o corte, use uma resolução de captura mais alta (como 1080x1920) e aumente a taxa de bits de captura para processar os pixels extras.
  • O corte extremo resulta em uma imagem de baixa qualidade, especialmente se a imagem cortada for aprimorada.

  • Evite aumentar a escala de uma resolução menor para uma maior. O upscaling tenta criar detalhes que não estão presentes. Mantenha a resolução mais alta desejada desde o início.

  • Se precisar aumentar, ajuste os parâmetros de codificação. Por exemplo, se a resolução ampliada tiver o dobro de pixels, dobre a taxa de bits.

A resolução e a taxa de bits estão inter-relacionadas. Por exemplo, transportar um vídeo de alta resolução por um pipeline de compartilhamento que, por fim, transcodifica para uma taxa de bits baixa gera uma imagem de qualidade inferior do que começar com uma resolução mais baixa. À medida que a taxa de bits diminui, há pontos de crossover em que resoluções menores começam a gerar resultados melhores:

Taxa de bits Resolução
Mais de 5 Mbps 1.080 x 1.920
1,5 a 5 Mbps ou mais 720 x 1.280
1,5 Mbps ou menos Equivalente a SD. A mesma contagem de pixels em uma proporção de 9:16 tem aproximadamente 416 x 736

Tabela 2. Taxa de bits versus resolução

Muitos apps conhecidos compartilham vídeos com resolução de 720p ou menos. Os dados indicam que 720p é uma opção adequada para metas de taxa de bits entre 1,5 e 5 Mbps.

Taxa de bits

Gravações

Usar uma taxa de bits de codificação mais alta proporciona a maior melhoria na qualidade do vídeo. Recomendamos escolher taxas de bits que correspondam aos apps de câmera nativos. Para uma resolução de 720 x 1280, recomendamos uma taxa de bits de captura de 10 Mbps.

Como a codificação de captura é feita no dispositivo, é possível usar uma taxa de bits mais alta para compensar a maioria das transformações de etapa de compartilhamento com pouco impacto negativo. Os arquivos resultantes maiores são usados apenas para manipulação no dispositivo.

É possível reduzir a taxa de bits na etapa final de transcodificação, conforme mostrado na tabela 2.

Compartilhamento

A taxa de bits tem o maior impacto no momento do compartilhamento, porque está diretamente relacionada ao tamanho do vídeo que será enviado. Há uma compensação entre a qualidade do vídeo, o tempo de transmissão do arquivo e os custos de armazenamento em nuvem.

A escolha do perfil de codificação, de frames B e valores delimitadoras de QP também é mais importante nessa fase do que durante a captura.

Recomendamos uma taxa de bits entre 4 e 5 Mbps (para resolução de 720 x 1280) para garantir uma boa qualidade visual.

Parâmetro de quantização (QP)

No Android 12 e versões mais recentes, as chaves QP são padronizadas e estão disponíveis na API MediaFormat e na biblioteca NDK Media. Em versões anteriores do Android, a manipulação de QP está disponível apenas por funções de framework que usam chaves específicas do fornecedor na configuração do MediaFormat.

Gravações

Durante a captura de vídeo, use o controle da taxa de bits em vez das configurações de QP, que nem sempre estão disponíveis.

Não recomendamos ajustar as configurações de QP para taxas de bits de captura de 10 Mbps (para 720 x 1280). Se a taxa de bits de captura for significativamente menor, abaixo de 5 Mbps para 720 x 1280, uma configuração de QP de 40 será um bom equilíbrio entre o aumento da qualidade sem forçar o codec a ultrapassar a taxa de bits de destino com muita frequência.

Compartilhamento

Recomendamos um limite máximo de QP de 40, especialmente quando a taxa de bits é inferior a 4 Mbps. Embora isso garanta uma qualidade mínima para os vídeos codificados, pode produzir um resultado com uma taxa de bits mais alta. O aumento na taxa de bits depende da complexidade do vídeo. Um app de compartilhamento pode tolerar alguma variação na taxa de bits do vídeo gerado, mas pode não tolerar um aumento além de um determinado limite.

Você pode limitar o aumento da taxa de bits recodificando o vídeo para compartilhamento com um limite de QP máximo menos restritivo (mais alto). Isso dá ao codec mais liberdade para sacrificar a qualidade e preservar outras partes do vídeo. É possível recodificar o vídeo para compartilhamento porque ele é uma operação de transcodificação: você já capturou o vídeo que pretende compartilhar.

A desvantagem é que repetir a etapa de transcodificação com esses diferentes parâmetros aumenta o tempo necessário para compartilhar o vídeo. Uma maneira de reduzir essa latência é analisar o vídeo parcialmente transcodificado para decidir se ele não está dentro da sua tolerância a sobreuso da taxa de bits. Se não estiver, interrompa a transcodificação e tente novamente com parâmetros QP mais apropriados.

Frames B e perfis de codificação

Considere usar frames B somente durante a etapa de compartilhamento e somente ao executar o Android 10 ou versões mais recentes.

Os apps precisam verificar os perfis de codificação com suporte usando CodecCapabilities, já que nem todos os dispositivos oferecem suporte aos perfis principais ou altos. Use o perfil mais alto com suporte do codificador de AVC: High > Main > Baseline. Para resultados mais seguros, não configure B-frames (KEY_LATENCY ou KEY_MAX_B_FRAMES) ao usar o perfil de referência, porque alguns codificadores podem falhar na configuração.

Os segmentos de código a seguir presumem um 'MediaFormat format' que será usado para configurar o codificador AVC

Android 10

API 29 ou mais recente

Use o perfil mais alto compatível e defina o parâmetro B-frame como 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

Não defina KEY_LATENCY nessa situação.

Android 8, 8.1 e 9

APIs 26, 27 e 28

Usar o perfil de maior suporte, mas desativar a geração de frames B. Isso acomoda algumas limitações no MediaMuxer nessas versões do sistema.

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

O valor KEY_LATENCY proíbe que os codecs gerem frames B, mas ainda aproveita outras eficiências de codec.

Caso seu app não use MediaMuxer para montar o arquivo de saída final, você poderá ativar os frames B definindo o valor KEY_LATENCY como 2 em vez de 1. Isso permite que o codec produza frames B.

Android 7.1 e anteriores

API 25 e anteriores

Use o perfil de referência para ter resultados mais seguros.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Antes da versão 7, o AOSP do Android oferece suporte apenas ao perfil de referência. No entanto, é provável que os OEMs tenham ativado um perfil principal/alto em alguns dispositivos, talvez usando um perfil específico do fornecedor.

Caso seu app não use MediaMuxer, use o perfil principal ou alto quando o codec oferecer suporte a ele. Não há uma chave de formato pública para controlar o número de frames B.

Use o módulo Transformer para transcodificar HDR para SDR

No Android 13 (nível 33 da API) e versões mais recentes, recomendamos usar o módulo Transformer do Jetpack Media3 para compartilhar conteúdo HDR com apps, serviços e dispositivos que não oferecem suporte a HDR. O módulo Transformer funciona mapeando por tons um stream de vídeo HDR de entrada para SDR e salvando o resultado como MP4, o que permite a reprodução bem-sucedida sem perda de detalhes ou brilho da imagem.

Observação: em dispositivos destinados a versões do sistema entre o Android 12 (nível 32 da API) até o Android 7.0 (nível 24 da API), o módulo Transformer funciona de forma diferente. Se o dispositivo for compatível com HDR, o app vai mostrar o conteúdo sem mapeamento de tons. Se o dispositivo não oferecer suporte a HDR, um erro vai aparecer indicando que não há suporte ao mapeamento de tons HDR.

O código a seguir configura um transformador. Esse tom mapeia a entrada para SDR e a recodifica no formato de entrada (como H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

Para testar a funcionalidade de mapeamento de tons, consulte o app de demonstração do Transformer.

Também é possível configurar o mapeamento de tons usando MediaCodec, embora a implementação seja mais complexa. Para mais informações, consulte a documentação de referência do MediaCodec.