Muitas pessoas compartilham vídeos usando dispositivos Android. A qualidade dos vídeo costuma ser inferior ao original por causa do processamento pelo app de compartilhamento. Este documento descreve como otimizar a qualidade vídeos compartilhados e algumas armadilhas comuns do processamento de vídeo que devem ser evitadas. Para otimizar para compartilhar conteúdo de vídeo HDR, consulte Use o módulo "Transformer" para transcodificar HDR para SDR nesta página.
O principal é manter uma resolução constante e a qualidade do vídeo o mais alto possível pelo maior tempo possível enquanto você se prepara para compartilhar um vídeo.
O pipeline de compartilhamento
A Figura 1 ilustra um fluxo típico para compartilhar um vídeo:
O pipeline inclui estas etapas:
- Capturar e codificar 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é-gravada de outro app.
- Editar, filtrar, retocar ou processar o vídeo de outra forma.
- Dimensione ou redimensione o vídeo em preparação para a transcodificação.
- Transcodificar o vídeo para compartilhamento. A filtragem na etapa 2 é frequentemente aplicada como fazer parte desta etapa.
Há duas etapas no pipeline em que você tem a oportunidade de definir parâmetros que determinam a qualidade do seu vídeo: a codificação durante o gravação e transcodificação antes do compartilhamento. Além disso, talvez seja necessário redimensione 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 para a qualidade do vídeo e indica quais etapas podem usá-los.
Parâmetro | Gravar | Compartilhar |
Perfil | Y | Y |
Resolução | Y | Y |
Taxa de bits | Y | Y |
Parâmetro de quantização (QP) | (raramente) | Y |
Quadros B | N | Y |
Perfil
Para melhores resultados, use os perfis mais avançados fornecidos pelo provedor codec. Para codificação AVC, selecione Alto perfil e nível 4.
Resolução, corte e dimensionamento
Você pode 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 vídeo. Recomendamos evitar o dimensionamento e selecionar uma resolução para o codificação para uso em todo o pipeline. Além disso, lembre-se de que as o corte resulta em uma imagem de baixa qualidade, especialmente se você aprimorar o corte imagem. Siga as seguintes diretrizes:
- Escolha uma resolução no mínimo equivalente à resolução final de compartilhamento.
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 dar suporte a resolução (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 maior, como 1080 x 1920, e aumentar captura a taxa de bits para lidar com os pixels extras.
O corte extremo resulta em uma imagem de baixa qualidade, especialmente se é aprimorada.
Evite aumentar a resolução de uma resolução mais baixa para uma mais alta. Tentativas de upscaling para criar detalhes que não estão presentes. Usar a resolução mais alta desejada desde o início.
Se você precisar de um upgrade, ajuste os parâmetros de codificação. Por exemplo, se o a resolução ampliada tem o dobro de pixels, o que dobra a taxa de bits.
A resolução e a taxa de bits estão inter-relacionadas. Por exemplo, carregar um protótipo de alta resolução vídeo por meio de um pipeline de compartilhamento que é transcodificado para uma baixa taxa de bits produz uma imagem de qualidade inferior do que começar com uma resolução mais baixa. Conforme o a taxa de bits diminui, há pontos de interseção em que resoluções menores começam a para ter melhores resultados:
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 em SD. A mesma contagem de pixels em uma proporção de 9:16 é de aproximadamente 416 x 736 |
Muitos apps conhecidos compartilham vídeos com uma resolução de 720p ou menor. Os dados indicam a resolução de 720p é a escolha adequada para metas de taxa de bits entre 1,5 e 5 Mbps.
Taxa de bits
Gravações
O uso de uma taxa de bits de codificação mais alta oferece a maior melhoria na qualidade de qualidade. Recomendamos escolher taxas de bits que correspondam aos apps de câmera nativos. Para um 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, você pode usar uma taxa de bits maior para compensar a maioria das transformações da etapa de compartilhamento com pouco impacto. 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 de compartilhamento, porque está diretamente relacionada ao tamanho do vídeo que será enviado. Há uma compensação entre o conteúdo qualidade, tempo de transmissão de arquivos e custos com armazenamento em nuvem.
A escolha do perfil de codificação, dos frames B e dos valores delimitadoras do 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 a 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
MediaFormat
e na API
NDK Media library.
Em versões anteriores do Android, a manipulação de QP está disponível apenas pelo framework
funções usando chaves específicas do fornecedor na configuração de MediaFormat
.
Gravações
Durante a captura de vídeo, use o controle de taxa de bits em vez das configurações de QP, que são 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 1.280). Se a taxa de bits de captura for significativamente menor, abaixo de 5 Mbps para 720 x 1280, uma configuração QP de 40 é um bom meio-termo entre aumentar a qualidade sem forçar o codec a ultrapassar a taxa de bits desejada com muita frequência.
Compartilhamento
Recomendamos um limite QP máximo de 40, especialmente quando a taxa de bits for inferior a 4 Mbps. Isso garante uma qualidade mínima para os vídeos codificados, mas pode produzir uma resultam em 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, ele pode não tolerar um aumento um determinado limite.
Você pode limitar o aumento da taxa de bits recodificando o vídeo para compartilhamento com um limite máximo do QP menos restritivo (mais alto). Isso dá ao codec mais liberdade sacrificar a qualidade e preservar outras partes do vídeo. É possível recodificar vídeo para compartilhamento, porque é uma operação de transcodificação; você já capturou o vídeo que você pretende compartilhar.
A desvantagem é que repetir a etapa de transcodificação com esses aumenta o tempo necessário para compartilhar o vídeo. Uma forma de reduzir latência é analisar o vídeo parcialmente transcodificado para decidir se ele estão dentro da sua tolerância ao excedente da taxa de bits. Se não estiver, você pode interromper e tente de novo com parâmetros QP mais adequados.
frames B e perfis de codificação
Considere usar frames B apenas durante a etapa de compartilhamento e somente ao executar Android 10 ou versão mais recente.
Os apps devem verificar os perfis de codificação compatíveis usando
CodecCapabilities
,
já que nem todos os dispositivos dão suporte
a perfis principais ou elevados. Usar o perfil mais alto
compatíveis com o codificador AVC: Alto > Principal > Valor de referência. Para resultados mais seguros, não
configurar B-frames
(KEY_LATENCY
ou
KEY_MAX_B_FRAMES
).
ao usar o valor de referência
porque a configuração de alguns codificadores pode falhar.
Os seguintes segmentos de código presumem um 'MediaFormat format'
que será usado para
configure 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
Use o perfil mais suportado, mas desative a geração de B-frames. Isso
acomoda algumas limitações no
MediaMuxer
nestas versões do sistema
format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);
O valor KEY_LATENCY
proíbe os codecs de gerar frames B, mas ainda
e aproveitar outras eficiências de codec.
Se o app não usa MediaMuxer
para montar o arquivo de saída final, você pode
ative os frames B definindo o valor KEY_LATENCY
como 2 em vez de 1. Isso deve
permitem 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 OEMs tenham ativado um perfil principal/alto em alguns dispositivos, talvez usando um perfil específico do fornecedor.
Caso seu app não use o MediaMuxer
, use o perfil principal ou alto quando:
o codec for compatível. Não há chave de formato pública para controlar o número de chaves B-
frames.
Usar o módulo "Transformer" para transcodificar HDR para SDR
No Android 13 (nível 33 da API) e versões mais recentes, recomendamos o uso do Transformer para compartilhar conteúdo HDR com apps, serviços e dispositivos que não oferecer suporte a HDR. O módulo "Transformer" usa o mapeamento por tons insere o stream de vídeo HDR em SDR e salva o resultado como MP4, o que ativa reprodução 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 (API de nível 24), o módulo Transformer funciona de forma diferente. Se o dispositivo oferecer suporte a HDR, o app vai abrir o conteúdo sem mapeamento de tons. Se o dispositivo não for compatível com HDR, um erro será exibido indicando que o HDR o mapeamento de tons não é compatível.
O código a seguir configura um Transformer, que tom mapeia a entrada para SDR e o 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 a App de demonstração do Transformer.
Também é possível configurar o mapeamento de tons usando
MediaCodec
, embora a implementação
é mais complexo. Para mais informações, consulte a
MediaCodec
.